Вам нужно «поднять» неуниверсальный IEnumerable
до IEnumerable<string>
. Было предложено использовать OfType
, но это метод фильтрации. То, что вы делаете, является эквивалентом приведения, для которого есть оператор Cast
:
var fields = RequestFields().Cast<string>();
Как указал Франс, это обеспечивает доступ только к ключам. Вам по-прежнему нужно индексировать в коллекцию для значений. Вот метод расширения для извлечения KeyValuePair
s из NameValueCollection
:
public static IEnumerable<KeyValuePair<string, string>> ToPairs(this NameValueCollection collection)
{
if(collection == null)
{
throw new ArgumentNullException("collection");
}
return collection.Cast<string>().Select(key => new KeyValuePair<string, string>(key, collection[key]));
}
Изменить: В ответ на запрос @Ruben Bartelink, вот как получить доступ к полному набору значений для каждого ключа, используя ToLookup
:
public static ILookup<string, string> ToLookup(this NameValueCollection collection)
{
if(collection == null)
{
throw new ArgumentNullException("collection");
}
var pairs =
from key in collection.Cast<String>()
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<string>()
from value in collection.GetValues(key)
select (key, value);
}