KeyedCollection — это коллекция чего?

#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, спасибо за разъяснение по явным типам и переменным. Не могли бы вы порекомендовать класс, который мог бы послужить моей цели? Мне нужна коллекция пар ключ / значение. Спасибо!