列表的不同列表,其中列表包含相同的值但顺序不同

我有一个清单:

var list = new List<List>(); 

可能包含

 list[0] = {1, 2, 3, 4} list[1] = {3, 1, 2, 4} list[2] = {2, 1, 7, 3} 

如何检测[0]和[1]之间的重复并删除其中一个? 代码是c-sharp。

实际上它不是一个int,但这不应该改变问题。

您可以编写自己的IEqualityComparer> 。 对于GetHashCode()它只返回列表中元素的所有哈希码的XOR。 对于Equals() ,它将从第一个列表创建一个新的HashSet ,并在其上调用HashSet.SetEquals ,并传入第二个列表。 请注意,这假设没有重复的元素。 (否则{1,1,2}将等于{1,2,2},但具有不同的哈希码。)

一旦你到目前为止,你可以使用Distinct

 var distinct = list.Distinct(new CustomEqualityComparer()); 

作为替代方法,您可以使用HashSet作为您的集合类型吗? 那真的很容易:

 var distinct = sets.Distinct(HashSet.CreateSetComparer()); 

如果您需要列表作为输入,但可以处理集合作为输出:

 var distinct = list.Select(x => new HashSet(x)) .Distinct(HashSet.CreateSetComparer()); 

这里是Jon Skeet所谈论的euqality比较器(当然,他关于使用HashSets的建议也是当然的):

  public class EnumerableComparer : IEqualityComparer> where T : IComparable { public bool Equals(IEnumerable first, IEnumerable second) { if (first == second) return true; if ((first == null) || (second == null)) return false; return new HashSet(first).SetEquals(second); } public int GetHashCode(IEnumerable enumerable) { return enumerable.OrderBy(x => x) .Aggregate(17, (current, val) => current*23 + val.GetHashCode()); } } 

所以你要做的事情如下:

 list.Distinct(new EnumerableComparer()); 

如果元素不保证是唯一的 – 使用我在这里发布的IEqualityComparer : 比较两个集合的相等性,而不管它们中的项目顺序如何

(在以前的编辑中,我错误地发布了一个IEqulityComparer,用于比较两个列表列表 – 在处理分区时可能非常有用,但这是一个不同的主题)

 boolean compareLists(list1, list2) { // Early rejection if (list1.size != list2.size) { return false; } // Sort lists and compare each item sorted1 = sort(list1.clone()); sorted2 = sort(list2.clone()); for (int i=0; i 
 list[1] = list[1].Except(list[0]).ToList(); 

这是假设我们需要从数组list[0]list[1]删除重复的int的解决方案。 其他答案正在处理删除包含同一组int的数组的情况。