如何使NameValueCollection
LINQ查询运算符可以访问,例如where,join,groupby?
我试过以下:
private NameValueCollection RequestFields() { NameValueCollection nvc = new NameValueCollection() { {"emailOption: blah Blah", "true"}, {"emailOption: blah Blah2", "false"}, {"nothing", "false"}, {"nothinger", "true"} }; return nvc; } public void GetSelectedEmail() { NameValueCollection nvc = RequestFields(); IQueryable queryable = nvc.AsQueryable(); }
但我得到一个ArgumentException告诉我源不是IEnumerable <>.
你需要的"升降机"的非通用IEnumerable
到IEnumerable
.有人建议您使用OfType
但这是一种过滤方法.你正在做的是相当于一个演员,有Cast
运营商:
var fields = RequestFields().Cast();
正如弗兰斯指出的那样,这只能提供对密钥的访问.您仍然需要为值集合索引.这是一个KeyValuePair
从以下方法中提取s 的扩展方法NameValueCollection
:
public static IEnumerable> ToPairs(this NameValueCollection collection) { if(collection == null) { throw new ArgumentNullException("collection"); } return collection.Cast ().Select(key => new KeyValuePair (key, collection[key])); }
编辑:为响应@Ruben Bartelink的请求,以下是如何使用以下方法访问每个密钥的完整值集ToLookup
:
public static ILookupToLookup(this NameValueCollection collection) { if(collection == null) { throw new ArgumentNullException("collection"); } var pairs = from key in collection.Cast () from value in collection.GetValues(key) select new { key, value }; return pairs.ToLookup(pair => pair.key, pair => pair.value); }
或者,使用C#7.0元组:
public static IEnumerable<(String name, String value)> ToTuples(this NameValueCollection collection) { if(collection == null) { throw new ArgumentNullException("collection"); } return from key in collection.Cast() from value in collection.GetValues(key) select (key, value); }
AsQueryable
必须采取IEnumerable
一个通用的.NameValueCollection
工具IEnumerable
,这是不同的.
而不是这个:
{ NameValueCollection nvc = RequestFields(); IQueryable queryable = nvc.AsQueryable(); }
试试OfType(它接受非通用接口)
{ NameValueCollection nvc = RequestFields(); IEnumerablecanBeQueried = nvc.OfType (); IEnumerable query = canBeQueried.Where(s => s.StartsWith("abc")); }
字典实际上可能更接近您想要使用的字典,因为它实际上将填充NameValueCollection填充的更多角色.这是Bryan Watts解决方案的变体:
public static class CollectionExtensions { public static IDictionaryToDictionary(this NameValueCollection source) { return source.Cast ().Select(s => new { Key = s, Value = source[s] }).ToDictionary(p => p.Key, p => p.Value); } }
我知道我迟到了,但只是想添加我的答案,不涉及.Cast
扩展方法,而是使用AllKeys属性:
var fields = RequestFields().AllKeys;
这将允许以下扩展方法:
public static IEnumerable> ToPairs(this NameValueCollection collection) { if(collection == null) { throw new ArgumentNullException("collection"); } return collection.AllKeys.Select(key => new KeyValuePair (key, collection[key])); }
希望这有助于未来的访客