Цикл Nested for добавляет в список удвоенное количество раз - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь перебрать два моих запроса LINQ, используя шаблон вложенного цикла foreach, а затем добавить элементы в KeyValuePair экземпляр списка:

LINQ-запросов:

var nameQuery = org.deltagerRelation
    .SelectMany(r => r.Deltager ?? new List<Deltager>())
    .Where(a => a.Enhedstype != null && a.Enhedstype == "PERSON")
    .SelectMany(d => d.Navne)
    .Select(n => n.Navn);

var boardMembersQuery = org.deltagerRelation
    .SelectMany(o => o.Organisationer ?? new List<Organisationer>())
    .SelectMany(m => m.MedlemsData)
    .SelectMany(a => a.Attributter)
    .SelectMany(v => v.Vaerdier)
    .Where(v => v.Vaerdi != null && v.Vaerdi == "BESTYRELSE")
    .Select(v => v.Vaerdi);

И вывод, который я получаю, как и ожидалось, nameQuery возвращает два имени, а boardMembersQuery возвращает двух членов правления.Однако, когда я запускаю их через вложенный цикл foreach, например, так:

foreach(var name in nameQuery)
{
    foreach(var boardMember in boardMembersQuery)
    {
        result.BoardMembers.Add(new KeyValuePair<string, JToken>(name, boardMember));
    }
}

Каждое из значений запроса добавляется в список два раза, и в результате получается четыре пары ключ / значение вместо двух.Неправильно ли реализован шаблон для каждого цикла или что-то еще пропущено?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Ну, я решил, что мне не нужен шаблон вложенного цикла foreach, я просто решил использовать метод Zip в результатах запроса LINQ:

var combinedResult = nameQuery.Zip(boardMembersQuery, (n, b) => new { Name = n, BoardMember = b });

и просто перебрал combinedResult и добавил свойства в список!

1 голос
/ 12 апреля 2019

Конечно, у вас есть 4 пары ключ-значение.

NameQuery имеет 2 результатов.

boardMemberQuery имеет 2 результаты.

Внешний цикл запускается 2 раза, а внутренний цикл выполняется 2 раза за выполнение внешнего цикла

2х2 = 4

...