Я изо всех сил старался сократить необходимый код, чтобы выполнить то, что, как я предполагаю, вы хотите выполнить. Кстати, я поместил полученные списки в список, который вы увидите:
этот следующий пример только для того, чтобы объявить ваш список и поместить случайные значения:
List<List<int>> ContainerList = new List<List<int>>()
{
new List<int>()
{
0, 1, 2
},
new List<int>()
{
3, 4, 6
},
new List<int>()
{
0, 1, 2
},
new List<int>()
{
7, 8, 9
},
};
Теперь начинается полезная нагрузка:
List<List<List<int>>> result = new List<List<List<int>>>();
foreach (var cont in ContainerList)
result.Add(ContainerList.FindAll(x => x.SequenceEqual(cont)));
// the following erase duplicates
result = result.Distinct().ToList();
Итак, теперь вы можете получить свои подсписки как:
[0] [0] 012
[0] [1] 012
[1] [0] 346
....
ПОЯСНЕНИЯ:
ContainerList.FindAll(x => x.SequenceEqual(cont))
В следующем фрагменте используется предикат: x здесь - это значение в вашем списке.
Поскольку это список списка, ваш x будет списком
SequenceEqual означает, что функция Findall будет искать равенства по VALUE, а не по REFERENCE.
Далее мы удаляем дубликаты, потому что Findall в первом элементе ContainerList вернет список, содержащий все его дубликаты, соответствующие данному параметру (который равен x).
Но по мере увеличения параметра (x) в списке. Вы сделаете столько FindAll, сколько существует значений одного и того же подмножества. Таким образом, в приведенном выше примере у вас будет 2 списка по 2 012;
Надеюсь, это понятно. Мой английский ужасен.