gpt4 book ai didi

c# - 比较两个集合值 c#

转载 作者:行者123 更新时间:2023-12-05 09:18:18 28 4
gpt4 key购买 nike

我有两个具有相同值的集合,但它们具有不同的引用。在没有 foreach 语句的情况下比较两个集合的最佳方法是什么,下面是我创建的示例应用程序,

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace CollectionComparer
{
public class Program
{
private static void Main(string[] args)
{
var persons = GetPersons();
var p1 = new ObservableCollection<Person>(persons);
IList<Person> p2 = p1.ToList().ConvertAll(x =>
new Person
{
Id = x.Id,
Age = x.Age,
Name = x.Name,
Country = x.Country
});

//p1[0].Name = "Name6";
//p1[1].Age = 36;

if (Equals(p1, p2))
Console.WriteLine("Collection and its values are Equal");
else
Console.WriteLine("Collection and its values are not Equal");
Console.ReadLine();
}

public static IEnumerable<Person> GetPersons()
{
var persons = new List<Person>();
for (var i = 0; i < 5; i++)
{
var p = new Person
{
Id = i,
Age = 20 + i,
Name = "Name" + i,
Country = "Country" + i
};
persons.Add(p);
}
return persons;
}
}
}

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Country { get; set; }
}

在上面的代码中,我需要比较集合 p1 和 p2。但结果总是以“集合及其值不相等”的形式出现,因为这两个集合具有不同的引用。有没有一种通用的方法可以在不使用 foreach 和比较特定类型的属性的情况下进行这种比较。

最佳答案

您可以使用 Enumerable.SequenceEqual<T>(IEnumerable<T> first, IEnumerable<T> second) .

这将比较两个序列按顺序并返回true如果其中包含的项目相等,并且两者具有相同数量的元素。

一个警告,因为 Person不会覆盖 Equals(object obj) , SequenceEqual将在比较任意两个 Person 时执行默认的引用相等性检查对象,并且您可能需要值相等语义。要解决此问题,至少要覆盖 bool Equals(object obj)int GetHashCode() (同时实现 IEquatable<Person> 也是一种很好的做法):

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Country { get; set; }

public override bool Equals(object obj)
{
var person = obj as Person;

if (person == null) return false;

return person.Id == Id && person.Name = Name && //etc.
}

public override int GetHashCode()
=> Id.GetHashCode() ^ Name.GetHashCode() ^ //etc.
}

如果不能修改Person , 然后你可以定义你自己的 IEqualityComparer<Person>然后把它交给SequenceEquals因此它可以执行除默认引用相等性之外的相等性检查。

更新:如果顺序不重要,那么您可以使用 Union Except .这可能会很快变慢,因此您至少应该考虑将您正在比较的集合转换为某种类型的 Set 的可能性。之前。

更新 2:Enumerable.SequenceEqual实际上是一个扩展 方法,应该这样调用:p1.SequenceEquals(p2)

关于c# - 比较两个集合值 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45098999/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com