2017-08-30 98 views
-2

删除重复IEnumerable 如何从给定的集合集合中删除重复的内容?不考虑订单。 从IEnumerable <IEnumerable <T>>

例如。

IEnumerable<IEnumerable<T>> Collection = [{1,2,3} , {2,1,3}, {1,1,2}, {1,2,2}] 

应该

IEnumerable<IEnumerable<T>> Collection = [{1,2,3} , {1,1,2}, {1,2,2}] // [ {2,1,3}, {1,1,2}, {1,2,2}] is also valid 

**编辑**

我明白,对于IEnumerables E1和E2我可以做这样的事情,找到重复:

bool equal = (E1.Count() == E2.Count() && (!E1.Except(E2).Any() || !E2.Except(E1).Any())) 

if(equal) 
{ 
    //Do something 
} 

但是,如何做类似

IEnumerable<IEnumerable<T>> 
+0

你有试过什么吗?你有什么想法解决这个问题?这不是一个代码写入服务。所以,你希望你在来之前展现出一些努力并提出具体的问题。 –

+0

请提供一些编译和显示您以前的工作的代码。 – Sefe

+0

你可以找到这个线程相当有用:https://softwareengineering.stackexchange.com/questions/339317/find-duplicate-in-a-list-of-a-list-of-integers/339318#339318 – Absurd

回答

1

诀窍是建立一个新的列表,只包含唯一的项目。您的支票确实没有 不适用于所有边缘情况(例如,您的支票是成功的{1, 1, 2} == {1, 2, 3},因为只能比较值类型的平等性而非身份)。

最简单的方法就是分类收集和比使用Enumerable.SequenceEqual

public static class Helper 
{ 
    public static IEnumerable<IEnumerable<int>> Unique(this IEnumerable<IEnumerable<int>> source) 
    { 
     var list = new List<List<int>>(); // sorted reference list. 

     foreach (var toCompare in source) 
     { 
     var toComp = toCompare.OrderBy(x => x).ToList(); // prevent multiple enumerations. 
     if (!list.Any(item => toComp.SequenceEqual(item))) 
     { 
      list.Add(toComp); 
      yield return toCompare; // return the unsorted one! 
     } 
     } 
    } 
} 

的使用

var unique = collection.Unique(); 

怎么以上工作代码:

我们把所有的参考名单返回的项目,但参考列表已排序。然后,我们枚举源列表,对每个项目进行排序,并检查它是否已经在我们的参考列表中,如果不是,我们将排序的项目添加到参考列表中,并将未排序的原始项目添加到yield return

相关问题