Как найти общую цепочку цифр для всех List>?
Есть лист
List<List<int>> numbers = new List<List<int>>()
{
new List<int>() { 1, 29, 36, 4, 5 }, //1, 4, 5
new List<int>() { 1, 20, 4, 40, 5 }, //1, 4, 5
new List<int>() { 1, 369, 4, 5 }, //1, 4, 5
new List<int>() { 1, 22, 33, 4, 5, 963 }, //1, 4, 5
new List<int>() { 1, 2, 3, 4, 5 } //1, 4, 5
};
Как найти в нем общую цепочку цифр? То есть те цифры, которые будут едиными для всех new List() входящих в состав numbers.
В данном примере это последовательность:
1, 4, 5
Ответы (2 шт):
Автор решения: timur
→ Ссылка
Можно использовать метод Enumerable.Intersect:
static List<int> FindIntersect(List<List<int>> numbers) {
IEnumerable<int> result = numbers.First();
for (int i = 1; i < numbers.Count; i++) {
result = result.Intersect(numbers[i]);
}
return result.ToList();
}
FindIntersect(numbers).ForEach(Console.WriteLine); //=> 1 4 5
Также можно сократить данный код, добавив метод Enumerable.Aggregate:
static List<int> FindIntersect(IEnumerable<IEnumerable<int>> numbers)
=> numbers.Aggregate((result, list) => result.Intersect(list)).ToList();
Автор решения: Alexander Petrov
→ Ссылка
Мне пришёл в голову такой способ решения.
var result = numbers
.SelectMany(list => list)
.GroupBy(n => n)
.Where(g => g.Count() == numbers.Count)
.Select(g => g.Key);
Группируем все числа и фильтруем те группы, количество значений в которых равно количеству списков.