如何比较两个无序的对象列表?

abdou31

我确定我的问题与 StackOverflow 上提出的许多问题类似。但我认为我的问题与这里提出的问题有点不同。

我真正需要的是比较两个只有 Id 且无序的对象列表:

List 1 of Person { Id Name }
List 2 of Person { Id Name }

假设我有这两个列表:

List 1 { 1 , John } , {2 , Mike } , {3 , Justin }
List 2 { 2 , Mike } , {1 , John } , {3 , Justin }

在这种情况下,返回的结果应该是true因为两个列表是相等的,忽略了顺序。

在另一种情况下:

List 1 { 1 , John } , {2 , Mike } , {4 , Justin }
List 2 { 2 , Mike } , {1 , John } , {3 , Justin }

这应该返回false.

我试过FindFindAllExcept但它们中的任何为我工作。这是我尝试过的最后一个解决方案:

 foreach(PersonModel d in PersonsList1) {
   var Test = PersonsList2.All(x => x.Id== d.Id);
 }

我怎样才能得到这个作品?

谢谢。

七州

如果您没有任何重复项,并且只想查看两个列表是否包含相同的 ID 集,那么这是一个集合操作,最简单的解决方案是使用HashSet<int>

bool same = list1.Select(x => x.Id).ToHashSet().SetEquals(list2.Select(x => x.Id));

您可以通过首先检查两个列表的长度来进行优化:如果它们的长度不同,则它们显然不同:

bool same = list1.Count == list2.Count &&
    list1.Select(x => x.Id).ToHashSet().SetEquals(list2.Select(x => x.Id));

如果要获取两个列表之间不同的对象,可以使用HashSet<T>.SymmetricExceptWith. 这里的问题是我们现在需要Person直接比较对象,而不是先获取它们的 ID,因为需要Person从另一侧获取这些对象。

因此,我们需要编写自己的IEqualityComparer

public class PersonIdComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y) => x.Id == y.Id;
    public int GetHashCode(Person x) => x.Id.GetHashCode();
}

var set = list1.ToHashSet(new PersonIdComparer());
set.SymmetricExceptWith(list2);
// set now contains the differences

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章