Ответ 1
var query = from list in lists
from value in list
where lists.Where(l => l.Contains(value)).Any()
select new { List = list, Value = value };
Я немного новичок в LINQ, вот моя проблема.
Я пытаюсь без успеха использовать ключевые слова Aggregate/Except/Group в запросе Linq, но до сих пор не близко к решению.
[EDIT]
Может быть, например, List<List<int>>
и условие, что значение int отсутствует в остальных списках.
Если честно, если я попытался с несколькими foreach
, мне удастся найти значения, но, поскольку я пытаюсь изучить LINQ, я хотел бы знать, какой запрос я должен написать, чтобы получить результаты
например
1,2,6
1,6
3,5
5,10
3,10,6
вернет 2 и первый список
var query = from list in lists
from value in list
where lists.Where(l => l.Contains(value)).Any()
select new { List = list, Value = value };
Это даст вам уникальные целые числа:
var ints = listOfLists.SelectMany(l => l);
var uniques = ints.Where(i => ints.Count(val => val == i) == 1);
from lst in lists
from i in lst
group lst by i into grp
where grp.Count() == 1
select new { Value = grp.Key, List = grp.Single() };
Это даст вам числа, которые появляются только в 1 списке, вместе со списком, который содержит его
EDIT: упрощенный бит
var sets = new[] { "1,2,6", "1,6", "3,5,9", "5,10", "3,10,6" };
var grouped = sets.SelectMany(i => i.Split(','))
.GroupBy(i => i)
.Where(i => i.Count() == 1)
.Select(i => i.Key);
Console.WriteLine(string.Join(", ", grouped.ToArray())); //2, 9
Похоже, я придумал то же решение, что и Томас, просто используя функциональный синтаксис...
var uniques = listlist.SelectMany(l => l.Select(i => new {Item = i, Origin = l}))
.GroupBy(i => i.Item)
.Where(g => g.Count() == 1)
.Select(g => g.First());
Обратите внимание, что все наши решения предполагают, что числа в каждом списке уже различны; то есть если один список содержит повторяющееся значение, которое не находится ни в одном из других, оно все равно будет отклонено.