检查两个列表是否相等
我有一个类如下:
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))