Как перечислять через IDictionary

#c#

#c#

Вопрос:

Как я могу перечислять через IDictionary? Пожалуйста, обратитесь к приведенному ниже коду.

  public IDictionary<string, string> SelectDataSource
 {
    set
    {
        // This line does not work because it returns a generic enumerator,
        // but mine is of type string,string
        IDictionaryEnumerator enumerator = value.GetEnumerator();
    }
 }
  

Ответ №1:

Перечисление вручную встречается очень редко (по сравнению с foreach , например) — первое, что я бы посоветовал: убедитесь, что вам это действительно нужно. Однако, поскольку словарь перечисляет как пара ключ-значение:

 IEnumerator<KeyValuePair<string,string>> enumerator = value.GetEnumerator();
  

должно сработать. Или, если это только переменная метода (не поле), тогда:

 var enumerator = value.GetEnumerator();
  

или лучше (поскольку, если это не поле, оно, вероятно, нуждается в локальном удалении):

 using(var enumerator = value.GetEnumerator())
{ ... }
  

или лучший («ПОЦЕЛУЙ»):

 foreach(var pair in value)
{ ... }
  

Однако вы также всегда должны удалять любое существующее значение при замене. Кроме того, свойство только для набора встречается исключительно редко. Возможно, вы действительно захотите проверить, что здесь нет более простого API… например, метод, принимающий словарь в качестве параметра.

Ответ №2:

 foreach(var keyValuePair in value)
{
     //Do something with keyValuePair.Key
     //Do something with keyValuePair.Value
}
  

или

 IEnumerator<KeyValuePair<string,string>> enumerator = dictionary.GetEnumerator();

using (enumerator)
{
    while (enumerator.MoveNext())
    {
        //Do something with enumerator.Current.Key
        //Do something with enumerator.Current.Value
    }
}
  

Комментарии:

1. IDictionary<string, string> Не возвращает Dictionary<string, string>.Enumerator ;p Или, скорее, это могло бы произойти, если конкретная реализация окажется конкретной Dictionary<,> — но это не гарантировано.

Ответ №3:

если вы просто хотите перечислить это, просто используйте foreach(var item in myDic) ... для примера реализации см. Статью MSDN.

Ответ №4:

Гладкое решение

 using System.Collections;

IDictionary dictionary = ...;

foreach (DictionaryEntry kvp in dictionary) {
    object key = kvp.Key;
    object value = kvp.Value;
}