小编典典

检查两个列表是否相等

all

我有一堂课如下:

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);

但两者都给我假。

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

更新

我正在寻找标签与书中标签完全相同的帖子。

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])’
方法,并且此方法无法转换为存储表达式。

我该如何解决这个问题?


阅读 66

收藏
2022-05-27

共1个答案

小编典典

用于SequenceEqual检查序列相等性,因为Equals方法检查 引用相等性

var a = ints1.SequenceEqual(ints2);

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

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

第二个版本还需要再次检查,Count因为即使ints2包含的元素多于ints1. 所以更正确的版本是这样的:

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

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

var a = !ints1.All(ints2.Contains)
2022-05-27