这个问题已经在这里有了答案 :
比较两个List 对象是否相等,忽略顺序[重复] (9个答案)
6年前关闭。
我的课如下:
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);
但是两者都给我错了。
检查标签列表是否相等的最快方法是什么?
更新
我正在寻找TAGS与BOOK中的TAG完全相同的POSTS。
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();
我正在使用实体框架,但出现错误:
mscorlib.dll中发生类型’System.NotSupportedException’的异常,但未在用户代码中处理 附加信息:LINQ to Entities无法识别方法“ Boolean SetEquals(System.Collections.Generic.IEnumerable`1 [System.Int32])”方法,并且该方法无法转换为商店表达式。
mscorlib.dll中发生类型’System.NotSupportedException’的异常,但未在用户代码中处理
附加信息:LINQ to Entities无法识别方法“ Boolean SetEquals(System.Collections.Generic.IEnumerable`1 [System.Int32])”方法,并且该方法无法转换为商店表达式。
我该如何解决?
使用SequenceEqual检查,因为序列平等Equals的方法检查 引用相等 。
SequenceEqual
Equals
var a = ints1.SequenceEqual(ints2);
或者,如果您不在乎元素顺序使用Enumerable.All方法:
Enumerable.All
var a = ints1.All(ints2.Contains);
第二个版本也需要再次检查,Count因为即使ints2包含的元素多于,它也会返回true ints1。因此,更正确的版本将如下所示:
Count
ints2
ints1
var a = ints1.All(ints2.Contains) && ints1.Count == ints2.Count;
为了检查 不等式, 只需反转All方法的结果即可:
All
var a = !ints1.All(ints2.Contains)