Каков наилучший способ перебора словаря? - PullRequest
2264 голосов
/ 26 сентября 2008

Я видел несколько разных способов перебора словаря в C #. Есть ли стандартный способ?

Ответы [ 26 ]

1 голос
/ 16 сентября 2016

Просто хотел добавить свои 2 цента, так как большинство ответов касаются цикла foreach. Пожалуйста, взгляните на следующий код:

Dictionary<String, Double> myProductPrices = new Dictionary<String, Double>();

//Add some entries to the dictionary

myProductPrices.ToList().ForEach(kvP => 
{
    kvP.Value *= 1.15;
    Console.Writeline(String.Format("Product '{0}' has a new price: {1} $", kvp.Key, kvP.Value));
});

Хотя это добавляет дополнительный вызов '.ToList ()', может произойти небольшое улучшение производительности (как указано здесь foreach vs someList.Foreach () {} ), особенно при работе с большими словарями и параллельной работе это не вариант / не даст никакого эффекта.

Также обратите внимание, что вы не сможете назначать значения свойству «Значение» внутри цикла foreach. С другой стороны, вы также сможете манипулировать «ключом», что может привести к проблемам во время выполнения.

Если вы просто хотите «прочитать» ключи и значения, вы также можете использовать IEnumerable.Select ().

var newProductPrices = myProductPrices.Select(kvp => new { Name = kvp.Key, Price = kvp.Value * 1.15 } );
1 голос
/ 08 июня 2018

Я написал расширение для цикла по словарю.

public static class DictionaryExtension
{
    public static void ForEach<T1, T2>(this Dictionary<T1, T2> dictionary, Action<T1, T2> action) {
        foreach(KeyValuePair<T1, T2> keyValue in dictionary) {
            action(keyValue.Key, keyValue.Value);
        }
    }
}

Тогда вы можете позвонить

myDictionary.ForEach((x,y) => Console.WriteLine(x + " - " + y));
1 голос
/ 28 мая 2015
var dictionary = new Dictionary<string, int>
{
    { "Key", 12 }
};

var aggregateObjectCollection = dictionary.Select(
    entry => new AggregateObject(entry.Key, entry.Value));
0 голосов
/ 19 августа 2018

в дополнение к сообщениям с самым высоким рейтингом, где обсуждается использование

foreach(KeyValuePair<string, string> entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

или

foreach(var entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

наиболее полным является следующее, потому что вы можете видеть тип словаря из инициализации, kvp is KeyValuePair

var myDictionary = new Dictionary<string, string>(x);//fill dictionary with x

foreach(var kvp in myDictionary)//iterate over dictionary
{
    // do something with kvp.Value or kvp.Key
}
0 голосов
/ 16 апреля 2018

Dictionary Это универсальный класс коллекции в c #, в котором хранятся данные в формате значения ключа. Ключ должен быть уникальным и не может иметь значение null, тогда как значение может быть дублированным и null. Поскольку каждый элемент в словаре рассматривается как структура KeyValuePair , представляющая ключ и его значение. и, следовательно, мы должны взять тип элемента KeyValuePair во время итерации элемента. Ниже приведен пример.

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1,"One");
dict.Add(2,"Two");
dict.Add(3,"Three");

foreach (KeyValuePair<int, string> item in dict)
{
    Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}
0 голосов
/ 09 марта 2018

Словари являются специальными списками, тогда как каждое значение в списке имеет ключ которая также является переменной. Хорошим примером словаря является телефонная книга.

   Dictionary<string, long> phonebook = new Dictionary<string, long>();
    phonebook.Add("Alex", 4154346543);
    phonebook["Jessica"] = 4159484588;

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

Существует также два способа добавления одного значения в словарь: с помощью оператора скобок или с помощью метода Add.

Чтобы проверить, есть ли в словаре определенный ключ, мы можем использовать метод ContainsKey:

Dictionary<string, long> phonebook = new Dictionary<string, long>();
phonebook.Add("Alex", 415434543);
phonebook["Jessica"] = 415984588;

if (phonebook.ContainsKey("Alex"))
{
    Console.WriteLine("Alex's number is " + phonebook["Alex"]);
}

Чтобы удалить элемент из словаря, мы можем использовать метод Remove. Удаление элемента из словаря по его ключу - это быстро и очень эффективно. При удалении элемента из списка с использованием его значения процесс идет медленно и неэффективно, в отличие от функции удаления из словаря.

Dictionary<string, long> phonebook = new Dictionary<string, long>();
phonebook.Add("Alex", 415434543);
phonebook["Jessica"] = 415984588;

phonebook.Remove("Jessica");
Console.WriteLine(phonebook.Count);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...