2016-07-01 1 views
1

У меня есть вложенный список, содержащий набор списков, некоторые из этих списков дублируются, я хочу просто сделать второй список без дублированных списков. Я пробовал это:удаление дублированных списков из вложенного списка C#

 List<List<string>> liste1 = new List<List<string>>(); 
     List<List<string>> liste2 = new List<List<string>>(); 
     List<string> l1 = new List<string> { "a", "b", "c" }; 
     List<string> l2 = new List<string> { "h", "x", "g" }; 
     List<string> l3 = new List<string> { "a", "b", "c" }; 
     List<string> l4 = new List<string> { "z", "t", "n" }; 
     liste1.Add(l1); 
     liste1.Add(l2); 
     liste1.Add(l3); 
     liste1.Add(l4); 
     foreach (List<string> lis in liste1) 
     { 
      if(!liste2.Contains(lis)) 
      { 
       liste2.Add(lis); 
      } 
     } 

кажется легко, но его не работает, любая помощь будет оценена. Спасибо.

ответ

0

Используя Linq, вы могли бы добиться этого.

Вы можете воспользоваться методами расширения и найти SequentialEqual из двух списков. Если заказ не важен, используйте расширение Except (что-то вроде ... s.Except(x).Any()).

var liste2= liste1.Where((x,i)=> !liste1.Skip(i+1).Any(s=>s.SequenceEqual(x))); 

Проверить это Demo

+0

благодарит за ответ :) – Exii

+0

Без проблем, рад, что это помогло. –

0

Вы проверяете на равенство ссылок. Вместо того, чтобы использовать Contains попробовать эту замену

//if (!liste2.Contains(lis)) 
if(!liste2.Any(subList => subList.SequenceEqual(lis))) 

SequenceEqual является метод расширения на IEnumerable<T>. Я думаю, вам понадобится оператор using, импортирующий пространство имен System.Linq.

Если вы не хотите, чтобы проверить, что дочерние списки не являются последовательностью равна, но равно установленным (т.е. порядок не важен), а затем рассмотреть вопрос об использовании реализации ISet<T> как HashSet<int> вместо List<int>.

+0

спасибо за помощь! – Exii