一尘不染

检查两个列表是否相等[重复]

c#

这个问题已经在这里有了答案

比较两个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])”方法,并且该方法无法转换为商店表达式。

我该如何解决?


阅读 199

收藏
2020-05-19

共1个答案

一尘不染

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

var a = ints1.SequenceEqual(ints2);

或者,如果您不在乎元素顺序使用Enumerable.All方法:

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

第二个版本也需要再次检查,Count因为即使ints2包含的元素多于,它也会返回true ints1。因此,更正确的版本将如下所示:

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

为了检查 不等式, 只需反转All方法的结果即可:

var a = !ints1.All(ints2.Contains)
2020-05-19