Как найти общую цепочку цифр для всех 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);

Группируем все числа и фильтруем те группы, количество значений в которых равно количеству списков.

→ Ссылка