检查两个列表是否相等

我有一个类如下:

public class Tag { public Int32 Id { get; set; } public String Name { get; set; } } 

我有两个标签列表:

 List<Tag> tags1; List<Tag> tags2; 

我使用LINQ的select来获取每个标签列表的ID。 接着:

 List<Int32> ids1 = new List<Int32> { 1, 2, 3, 4 }; List<Int32> ids2 = new List<Int32> { 1, 2, 3, 4 }; List<Int32> ids3 = new List<Int32> { 2, 1, 3, 4 }; List<Int32> ids4 = new List<Int32> { 1, 2, 3, 5 }; List<Int32> ids5 = new List<Int32> { 1, 1, 3, 4 }; 

ids1应该等于ids2和ids3 …都有相同的数字。

ids1不应该等于ids4和ids5 …

我尝试了以下内容:

 var a = ints1.Equals(ints2); var b = ints1.Equals(ints3); 

但都给我虚假。

检查标签列表是否相等的最快方法是什么?

UPDATE

我正在寻找标签是完全一样的标签在书中。

 IRepository repository = new Repository(new Context()); IList<Tags> tags = new List<Tag> { new Tag { Id = 1 }, new Tag { Id = 2 } }; Book book = new Book { Tags = new List<Tag> { new Tag { Id = 1 }, new Tag { Id = 2 } } }; var posts = repository .Include<Post>(x => x.Tags) .Where(x => new HashSet<Int32>(tags.Select(y => y.Id)).SetEquals(book.Tags.Select(y => y.Id))) .ToList(); 

我正在使用entity framework ,我得到的错误:

mscorlib.dll中发生types“System.NotSupportedException”的exception,但未在用户代码中处理

附加信息:LINQ to Entities不识别方法的布尔SetEquals(System.Collections.Generic.IEnumerable`1 [System.Int32])'方法,并且此方法不能转换为存储expression式。

我如何解决这个问题?

使用SequenceEqual检查序列是否相等,因为Equals方法检查引用是否相等

 var a = ints1.SequenceEqual(ints2); 

或者如果你不关心元素顺序使用Enumerable.All方法:

 var a = ints1.All(ints2.Contains); 

第二个版本也需要对Count另一次检查,因为即使ints2包含比ints1更多的元素,它也会返回true。 所以更正确的版本会是这样的:

 var a = ints1.All(ints2.Contains) && ints1.Count == ints2.Count; 

为了检查不等式,只需将All方法的结果颠倒过来:

 var a = !ints1.All(ints5.Contains) 

List<T>相等不会逐个检查它们。 你可以使用LINQ的SequenceEqual方法 :

 var a = ints1.SequenceEqual(ints2); 

要忽略顺序,请使用SetEquals

 var a = new HashSet<int>(ints1).SetEquals(ints2); 

这应该起作用,因为您正在比较不包含重复项的ID序列。 如果是这样,你需要考虑重复,在线性时间做的方式是组成基于哈希的计数字典,为第一个序列的每个元素添加一个,为每个元素减去一个序列,并检查结果计数是否全为零:

 var counts = ints1 .GroupBy(v => v) .ToDictionary(g => g.Key, g => g.Count()); var ok = true; foreach (var n in ints2) { int c; if (counts.TryGetValue(n, out c)) { counts[n] = c-1; } else { ok = false; break; } } var res = ok && counts.Values.All(c => c == 0); 

最后,如果对O(N*LogN)解决scheme没有问题,则可以对两个序列进行sorting,并使用SequenceEqual比较它们是否相等。

 Enumerable.SequenceEqual(FirstList.OrderBy(fElement => fElement), SecondList.OrderBy(sElement => sElement))