我有List<List<int>>
,例如
List<List<int>>
有{{1,2,3}, {1,1,2,}, {1,2,3}}
。
我想在此删除重复:
结果应为:{{1,2,3}, {1,1,2}}
问题是内部列表是引用类型,因此它们具有不同的对象哈希码,因此被单独处理。
我不想完全迭代列表以查找重复项,因为它不是最佳的。
答案 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();
我得到了这个结果:
答案 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();
}