如何删除List <list <int>&gt;中的重复列表

时间:2015-07-05 09:56:02

标签: c# .net linq equality

我有List<List<int>>,例如 List<List<int>>{{1,2,3}, {1,1,2,}, {1,2,3}}

我想在此删除重复: 结果应为:{{1,2,3}, {1,1,2}}

问题是内部列表是引用类型,因此它们具有不同的对象哈希码,因此被单独处理。

我不想完全迭代列表以查找重复项,因为它不是最佳的。

5 个答案:

答案 0 :(得分:3)

试试这个:

List<List<int>> lst = new List<List<int>>()
{
    new List<int> {1,2,3},
    new List<int> {1,1,2}, 
    new List<int> {1,2,3}
};

var result = lst.GroupBy(c => String.Join(",", c)).Select(c => c.First().ToList()).ToList();

答案 1 :(得分:3)

您可以实现EqualityComparer类并在LINQ的Distinct方法中使用它。

public class CustomEqualityComparer : IEqualityComparer<List<int>>
{
     public bool Equals(List<int> x, List<int> y)
     {
         if (x.Count != y.Count)
             return false;
         for (int i = 0; i < x.Count; i++)
         {
            if (x[i] != y[i])
                return false;
         }
         return true;
     }

     public int GetHashCode(List<int> obj)
     {
         return 0;
     }
}

并像这样使用

public static void Main(string[] args)
{
    var list = new List<List<int>>() { new List<int> { 1, 1, 2 }, new List<int> { 1, 2, 3 }, new List<int> { 1, 1, 2 } };
    var res = list.Distinct(new CustomEqualityComparer());
    Console.WriteLine("Press any key to continue.");
    Console.ReadLine();
}

答案 2 :(得分:2)

这很简单:

List<List<int>> lst = new List<List<int>>()
{
    new List<int> {1,2,3},
    new List<int> {1,1,2,}, 
    new List<int> {1,2,3},
};

var result =
    lst
        .Where((xs, n) =>
            !lst
                .Skip(n + 1)
                .Any(ys => xs.SequenceEqual(ys)))
        .ToList();

我得到了这个结果:

result

答案 3 :(得分:0)

你想要的比简单的比较更复杂。 在我看来,你应该创建一个新的类型/类 IntegerCollection:ICollection

然后你应该以这种方式实现Equals:

bool Equals(IntegerCollection col) {    if(this.Count() != col.Count())
      return false;

   if(this.Sum() != col.Sum())
      return false;

   for(int i = 0; i < this.Count(); i++)    {
      if(this[i]==col[i]){
         continue;
      }else{
         return false;
      }    }

   return true; }

最后

List<IntegerCollection> collections = new List<IntegerCollection> {
     new IntegerCollection({1,2,3}),
     new IntegerCollection({1,1,2}),
     new IntegerCollection({1,2,3})};
var distincts = collections.Distinct();

答案 4 :(得分:0)

使用@ farid的CustomEqualityComparer,你也可以使用HashSet:

List<List<int>> RemoveDuplicates(IEnumerable<List<int>> values)
{
    return new HashSet<List<int>>(values,new CustomEqualityComparer()).ToList();
}