Наложение одного списка на другой список в C# - PullRequest
0 голосов
/ 01 апреля 2020

Я знаю код для эффективного наложения одного списка на другой в python, используя словари. Вот что я имею в виду:

ввод:

 dictA = {'c':2, 'e':1}; 
 print(dictA);

вывод:

{'c': 2, 'e': 1}

ввод:

dictB = {'a':0,'b':0,'c':0,'d':0,'e':0,'f':0}; 
print(dictB);

вывод:

{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0}

input:

dictB.update(dict(dictA)); 
print(dictB);

output:

{'a': 0, 'b': 0, 'c': 2, 'd': 0, 'e': 1, 'f': 0}

dictA накладывается на dictB, где 'c' и 'e' теперь имеют значения, которыми они были назначается в dictA.

Вопрос: Каков эквивалентный синтаксис в C# для наложения одного списка на другой, как указано выше?

Ответы [ 3 ]

3 голосов
/ 01 апреля 2020

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

foreach (var i in listB)
    listA[i.Key] = i.Value;

Обратите внимание, что listA и listB на самом деле Dictionary типа.

0 голосов
/ 01 апреля 2020

Если вы не возражаете против использования LINQ для создания нового Dictionary<char, int>, вы можете использовать ToDictionary():

var merged = listB
    .ToDictionary(kvp => kvp.Key, 
                  kvp => listA.TryGetValue(kvp.Key, out int value) ? value : kvp.Value);

, который в основном пытается получить доступ к ключу в listA с TryGetValue(), и в случае успеха устанавливает значение в listA, в противном случае оставьте значение listB.

0 голосов
/ 01 апреля 2020

Я бы предложил сделать что-то вроде этого:

void Main()
{
    var listA = new Dictionary<char, int>() { { 'c', 2 }, { 'e', 1 } };
    var listB = new Dictionary<char, int>() { { 'a', 0 }, { 'b', 0 }, { 'c', 0 }, { 'd', 0 }, { 'e', 0 }, { 'f', 0 },  };

    listA.ForEach(x => listB[x.Key] = x.Value);
}

public static class Ex
{
    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var t in source)
            action(t);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...