#c# #collections #keyedcollection
#c# #Коллекции #keyedcollection
Вопрос:
Я хочу создать метод, который выполнял бы итерации по коллекции с ключом. Я хочу убедиться, что мой метод поддерживает итерацию любой коллекции, которая расширяет KeyedCollection<string, Collection<string>>
Вот метод:
public void IterateCollection(KeyedCollection<string, Collection<string>> items)
{
foreach (??? item in items)
{
Console.WriteLine("Key: " item.Key);
Console.WriteLine("Value: " item.Value);
}
}
Очевидно, это не работает, потому что я не знаю, какой тип должен заменять вопросительные знаки в цикле. Я не могу просто поставить object
или var
, потому что мне нужно вызвать свойства Key
и Value
позже в теле цикла. Какой тип я ищу? Спасибо.
Комментарии:
1. Вам следует рассмотреть возможность использования ReSharper или любого другого инструмента для поддержки кода в вашей помощи. ReSharper предоставит вам возможность явно указать тип при использовании var. Итак, вы могли бы решить эту проблему с помощью простой комбинации клавиш в ReSharper (alt-enter)
2. А если вы призовете dynamic на помощь? В вашем случае элементом будет коллекция<string>, которую вернет KeyedCollection, KeyedCllection всегда будет возвращать <Titem> , проверьте это: msdn.microsoft.com/en-us/library/ms132438.aspx
Ответ №1:
KeyedCollection<TKey, TItem>
реализует ICollection<TItem>
, поэтому в этом случае вы бы использовали:
foreach(Collection<string> item in items)
Это то, что var
дало бы вам то же самое. Вы не получаете пары ключ / значение в KeyedCollection
— вы просто получаете значения.
Возможно ли, что KeyedCollection
действительно не самый подходящий тип для вас, чтобы использовать?
Комментарии:
1. Спасибо, Джон. Мне действительно нужна коллекция пар ключ / значение, поэтому я ошибаюсь в использовании
KeyedCollection
. Не могли бы вы, пожалуйста, порекомендовать мне класс, который был бы как можно более абстрактным, но мог бы служить моей цели? Спасибо.2. @Boris: Просто
IDictionary<TKey, TValue>
было бы моим предложением.
Ответ №2:
Тип элемента будет Collection<String>
по определению перечислителя KeyedCollection
. Вы не можете произвольно принимать решение об использовании соответствующего типа, чтобы получить оба Key
и Value
, если итерация его не поддерживает, чего в данном случае нет. Обратите внимание, что использование явного типа и var
абсолютно идентичны.
Если вы хотите, чтобы оба Key
и Value
были доступны в итерации, вам нужно использовать Dictionary<string, Collection<string>>
тип.
Комментарии:
1. mellamokb, спасибо за разъяснение по явным типам и переменным. Не могли бы вы порекомендовать класс, который мог бы послужить моей цели? Мне нужна коллекция пар ключ / значение. Спасибо!