Перечисление словаря в C#

Это сработало для меня!

g.V().hasLabel('Location').filter(has('name',between('US','UT'))) .project('Name','Active', 'Inactive', 'Total')  .by('name')  .by(__.both('people_location').out('people_usertype') .where(values('activationStatus').is(eq('Active'))).count())  .by(__.both('people_location').out('people_usertype') .where(values('activationStatus').is(eq('Inactive'))).count())  .by(__.both('people_location').out('people_usertype').count())

23
задан Liam 19 December 2013 в 11:30
поделиться

4 ответа

Для перечисления словаря Вы, любой перечисляет значения в нем:

Dictionary<int, string> dic;

foreach(string s in dic.Values)
{
   Console.WriteLine(s);
}

или KeyValuePairs

foreach(KeyValuePair<int, string> kvp in dic)
{
   Console.WriteLine("Key : " + kvp.Key.ToString() + ", Value : " + kvp.Value);
}

или ключи

foreach(int key in dic.Keys)
{
    Console.WriteLine(key.ToString());
}

Если Вы хотите обновить объекты в рамках словаря, необходимо сделать так немного по-другому, потому что Вы не можете обновить экземпляр при перечислении. То, что необходимо будет сделать, перечисляют другой набор, который не обновляется, как так:

Dictionary<int, string> newValues = new Dictionary<int, string>() { 1, "Test" };
foreach(KeyValuePair<int, string> kvp in newValues)
{
   dic[kvp.Key] = kvp.Value; // will automatically add the item if it's not there
}

Для удаления объектов сделайте так похожим способом, перечислив набор объектов, которые мы хотим удалить, а не сам словарь.

List<int> keys = new List<int>() { 1, 3 };
foreach(int key in keys)
{
   dic.Remove(key);
}
79
ответ дан 29 November 2019 в 00:40
поделиться

В решении проблемы "Я не могу обновить значение/ключ внутри foreach ()", Вы не можете изменить набор при перечислении его. Я приблизился бы к этому путем создания копии набора Ключей:

Dictionary<int,int> dic=new Dictionary<int, int>();

//...fill the dictionary

int[] keys = dic.Keys.ToArray();
foreach (int i in keys)
{
    dic.Remove(i);
}
9
ответ дан 29 November 2019 в 00:40
поделиться

Foreach. Существует три пути: можно перечислить по Keys свойство, по Values свойство или по самому словарю, который является перечислителем KeyValuePair<TKey, TValue>.

8
ответ дан 29 November 2019 в 00:40
поделиться

Я просто ответил на тот же (обновленный) вопрос для списков, таким образом, вот то же самое для словарей.

public static void MutateEach(this IDictionary<TKey, TValue> dict, Func<TKey, TValue, KeyValuePair<TKey, TValue>> mutator)
{
    var removals = new List<TKey>();
    var additions = new List<KeyValuePair<TKey, TValue>>();

    foreach (var pair in dict)
    {
        var newPair = mutator(pair.Key, pair.Value);
        if ((newPair.Key != pair.Key) || (newPair.Value != pair.Value))
        {
            removals.Add(pair.Key);
            additions.Add(newPair);
        }
    }

    foreach (var removal in removals)
        dict.Remove(removal);

    foreach (var addition in additions)
        dict.Add(addition.Key, addition.Value);
}

Обратите внимание, что мы должны сделать обновления вне цикла, таким образом, мы не изменяем словарь, поскольку мы перечисляем его. Также это обнаруживает столкновения, вызванные путем создания двух ключей тем же - оно бросит (из-за использования Add).

Пример - делает весь нижний регистр ключей и обрезает все значения с a Dictionary<string, string>:

myDict.MutateEach(key => key.ToLower(), value => value.Trim());

Если ключи не уникальны, когда сделанный нижним регистром, это бросит.

2
ответ дан 29 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: