Получить кроме нескольких вложенных словарей, используя выражение LINQ - PullRequest
5 голосов
/ 10 января 2020

Я хочу получить разные n номеров словарей, используя выражение lambda:

Dictionary<string, string> d1 = new Dictionary<string, string>();
d1.Add("Joe", "2, Barfield Way");
d1.Add("Mike", "17, Apollo Avenue");
d1.Add("Jane", "69, Lance Drive");


Dictionary<string, string> d2 = new Dictionary<string, string>();
d2.Add("Joe", "2, Barfield Way");
d2.Add("Jane", "69, Lance Drive");
// var diff = d1.Except(d2);

Допустим, я хочу получить разницу между двумя вышеуказанными словарями var diff = d1.Except(d2);

Теперь я хочу получить то же самое, используя лямбда-выражение для N номеров словарей.

На мгновение я объединил два словаря в один. Я хочу получить разницу двух словарей, используя выражение lambda или любое другое выражение LINQ.

Dictionary<string, Dictionary<string, string>> d = new Dictionary<string, Dictionary<string, string>>();
d.Add("Test", d1);
d.Add("Test2", d2);

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

d.Select(c => c.Value.Except(c.Value))

Ответы [ 4 ]

4 голосов
/ 10 января 2020

Вам нужно несколько методов Linq:

var result = d.SelectMany(d => d.Value).GroupBy(c => c.Key)
              .Where(c => c.Count() == 1).ToDictionary(t => t.Key, t => t.Select(c => c.Value)
              .FirstOrDefault()).ToList();
1 голос
/ 10 января 2020

Преобразуйте его в коллекцию из KeyValuePair<> перечислимых и следуйте тому же логу c, используя .Aggregate()

var result = d.Select(x => x.Value.AsEnumerable()).Aggregate((x, y) => x.Except(y));
0 голосов
/ 10 января 2020

Таким образом, вы получите тот же результат:

Dictionary<string, string> d1 = new Dictionary<string, string>();
d1.Add("Joe", "2, Barfield Way");
d1.Add("Mike", "17, Apollo Avenue");
d1.Add("Jane", "69, Lance Drive");

Dictionary<string, string> d2 = new Dictionary<string, string>();
d2.Add("Joe", "2, Barfield Way");
d2.Add("Jane", "69, Lance Drive");

var diff = d1.Except(d2);

Dictionary<string, Dictionary<string, string>> d = new Dictionary<string, Dictionary<string, string>>();
d.Add("Test", d1);
d.Add("Test2", d2);

var diff1 = d.SelectMany(x => x.Value).GroupBy(x => new { x.Key, x.Value }).Where(x => x.Count() == 1).SelectMany(x => x.AsEnumerable());
0 голосов
/ 10 января 2020

Вы можете сохранить словари в List<Dictionary<string, string>>.

Затем запросить эту коллекцию и группу по ключам, отфильтровать по количеству ключей, чтобы получить только уникальные, а затем создать новый словарь:

var d1 = new Dictionary<string, string>
{
    { "Joe", "2, Barfield Way" },
    { "Mike", "17, Apollo Avenue" },
    { "Jane", "69, Lance Drive" }
};

var d2 = new Dictionary<string, string>
{
    { "Joe", "2, Barfield Way" },
    { "foo", "bar" },
    { "Jane", "69, Lance Drive" }
};

var d3 = new Dictionary<string, string>
{
    { "hello", "world" },
    { "foo", "bar" }
};

var dicts = new List<Dictionary<string, string>>
{
    d1,
    d2,
    d3
};

var distinct = dicts.SelectMany(d => d)          // Flatten the collection of dictionaries
                    .GroupBy(d => d.Key)         // Group the sequence by key
                    .Where(d => d.Count() == 1)  // Filter the result for unique keys only
                    .ToDictionary(k => k.Key, v => v.Select(x => x.Value)
                                                    .First()); // Materialize the sequence in a Dictionary<string, string>

foreach (var key in distinct.Keys)
{
    Console.WriteLine($"{key} -> {distinct[key]}");
}

Вывод

Mike -> 17, Apollo Avenue
hello -> world
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...