Yoyosch Ответов: 3

В LINQ присоединиться на внутренней коллекции


Привет,

Я получил следующую коллекцию:
List<(string, List<string>)> items = new List<(string, List<string>)>
{
    ("col1", new List<string>{"1","2","3"}),
    ("col2", new List<string>{"1","3","4"})
};

Мне нужно превратить его в List<string, (bool, bool)>:
{
    ("1", (true, true)),  // (because "1" exists in col2)
    ("2", (true, false)), // (because "2" does NOT exists in col2)
    ("3", (true, true)),
    ("4", (false, true))
}

Не могли бы вы посоветовать, как сделать это красиво? Заявление о присоединении будет достаточным?

Заранее спасибо

Что я уже пробовал:

Я пробовал использовать GroupBy, но это очень громоздко

3 Ответов

Рейтинг:
24

Richard Deeming

Выполнение этого в виде одного утверждения не будет особенно чистым, но это можно сделать:

var result = items.Where(i => i.Item1 == "col1").SelectMany(i => i.Item2)
    .Union(items.Where(i => i.Item1 == "col2").SelectMany(i => i.Item2))
    .Select(key => 
    (
        key, 
        (
            items.Any(i => i.Item1 == "col1" && i.Item2.Contains(key)), 
            items.Any(i => i.Item1 == "col2" && i.Item2.Contains(key))
        )
    ))
    .ToList();
Перечислимый.Метод Объединения (System.Linq) | Microsoft Docs[^]


TheRealSteveJudge

5*

Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Попробовать это:

List<(string, List<string>)> items = new List<(string, List<string>)>
{
    ("col1", new List<string>{"1","2","3"}),
    ("col2", new List<string>{"1","3","4"})
};

var result = items
	.SelectMany(x=>x.Item2.Select(y=> Tuple.Create(y, x.Item1)))
	.GroupBy(x=>x.Item1)
	.Select(grp=> new {Item1 = grp.Key, Item2 = items.Select(x=>grp.Any(y=>y.Item2==x.Item1)).ToList()})
	.ToList();

Результат:
1, {true, true}
2, {true, false}
3, {true, true} 
4, {false, true}


TheRealSteveJudge

5*

Maciej Los

Спасибо!

Рейтинг:
0

Yoyosch

Я получил следующее решение:

Список<(строка, список<строка> В)&ГТ; позиции = новый список<(строка, список<строка> В)&ГТ;
{
("col1", новый список<string>{"1","2","3"}),
("col2", новый список<string>{"1","3","4","5"})
};

var distinctIds = предметы.SelectMany(x => x.Item2).Distinct();

var ids = distinctIds.Выберите(x => (x, items.Во-первых(y => y.Item1 == "col1").Место № 2.Любой(г =&ГТ; у == Х), элементы.Во-первых(y => y.Item1 == "col2").Место № 2.Любой(г =&ГТ; у == Х))).Список();

Это работает, но можно ли встроить эту логику в один запрос linq?


Maciej Los

Да, это возможно. См. решение № 3 ;)

Кстати: Ваш ответ-это не решение. Я бы предложил удалить его, чтобы избежать голосования вниз. Такой контент должен быть размещен в виде комментария, или вы должны улучшить свой вопрос.