Цикл по System.Collections.Generic.Dictionary через для оператора - PullRequest
6 голосов
/ 20 января 2010

У меня быстрый вопрос.Есть ли способ легко пройти через System.Collections.Generic.Dictionary через for оператор в C #?

Заранее спасибо.

Ответы [ 9 ]

11 голосов
/ 20 января 2010

Вы можете использовать foreach:

Dictionary<string,string> dictionary = new Dictionary<string,string>();

// ...

foreach (KeyValuePair<string,string> kv in dictionary) 
{
    string key = kv.Key;
    string value = kv.Value;
}
7 голосов
/ 20 января 2010

Не разумно, нет. Вы можете использовать расширение Linq ElementAt:

for (int i = 0; i < dictionary.Keys.Count; i++)
{
    Console.WriteLine(dictionary.ElementAt(i).Value);                
}

... но я действительно не вижу смысла. Просто используйте обычный foreach подход. Если вам по какой-то причине необходимо отслеживать индекс во время итерации, вы можете сделать это «на стороне»:

int index = 0;
foreach (var item in dictionary)
{
    Console.WriteLine(string.Format("[{0}] - {1}", index, item.Value));

    // increment the index
    index++;
}
3 голосов
/ 20 января 2010

Есть несколько способов. Цикл по клавишам:

foreach(var key in myDictionary.Keys)

перебирая значения:

foreach(var value in myDic.Values)

цикл по парам:

foreach(KeyValuePair<K, V> p in myDic)
{  
     var key = p.Key;
     var value = p.Value
}
0 голосов
/ 05 декабря 2014

Если это не обязательно должен быть цикл for, возможно, используется метод Dictionary.GetEnumerator с опцией while, но это тоже довольно просто ИМХО

var enumerator = d.GetEnumerator();
while (enumerator.MoveNext())
{
var pair = enumerator.Current;
b += pair.Value;
}
enumerator.Dispose();

фрагмент кода из C # Dictionary GetEnumerator

0 голосов
/ 20 января 2010

Это может быть сделано, но это немного глупо, ИМО

        Dictionary<string,string> dictionary = new Dictionary<string, string>();
        Dictionary<string, string>.Enumerator enumerator = dictionary.GetEnumerator();
        for (int i = 0; i < attributeValues.Count;i++ )
        {
            KeyValuePair<string, string> current = enumerator.Current;
            //do something usefull
            enumerator.MoveNext();
        }

единственная вещь, полученная этим, - это (довольно бесполезный) индекс, и если это реальная цель, вам лучше подойдет что-то вроде этого:

        int currentIndex = 0;
        foreach (KeyValuePair<string, string> keyValuePair in dictionary)
        {
            //do something usefull
            currentIndex++;
        }
0 голосов
/ 20 января 2010

Филипп получил его за foreach, хотя я обычно упрощаю его до:

foreach (var pair in dictionary) 
{
    var key = pair.Key;
    var value = pair.Value;
}

Невозможно пройти через эту коллекцию пар ключ-значение, используя цикл for, потому что они хранятся не по порядку. Вы можете циклически просматривать ключи или значения в виде коллекций.

0 голосов
/ 20 января 2010

Если вы используете Net 3.5 или более позднюю версию, вы можете использовать LINQ и предикат, чтобы найти определенное значение или значения. Словари не обязательно хранят свои пары KeyValue по порядку (ни по порядку ввода, ни по порядку ключей).

0 голосов
/ 20 января 2010

Вы можете зациклить клавиши

 for(int i = 0; i < myDictionary.Keys.Length; ++i)
      myDictionary.Keys[i] ...

или значения

 for(int i = 0; i < myDictionary.Values.Length; ++i)
      myDictionary.Values[i] ...

Или оба, как показывает Филипп

0 голосов
/ 20 января 2010

Нет, for в основном для коллекций с индексами. Вы можете foreach легко, однако.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...