gpt4 book ai didi

C# 获取两个匹配列表的差异

转载 作者:太空宇宙 更新时间:2023-11-03 19:49:48 26 4
gpt4 key购买 nike

我需要比较两个包含同一类对象的列表,但并不是每个属性都应该用于检查差异。例如。不应使用 Id(主键)属性。

我的示例类:

class MyClass
{
public System.Nullable<int> Id { get; set; }
public int VMId { get; set; }
public string Name { get; set; }
}

var oldR = new List<MyClass>();
oldR.Add(new MyClass() { Id = 1, VMId = 11, Name = "Test1" });
oldR.Add(new MyClass() { Id = 2, VMId = 22, Name = "Test2" });
oldR.Add(new MyClass() { Id = 3, VMId = 33, Name = "Test3" });
oldR.Add(new MyClass() { Id = 4, VMId = 44, Name = "Test4" });
oldR.Add(new MyClass() { Id = 5, VMId = 55, Name = "Test5" });

var newR = new List<MyClass>();
newR.Add(new MyClass() { Id = null, VMId = 22, Name = "Test2" });
newR.Add(new MyClass() { Id = null, VMId = 33, Name = "Test3" });
newR.Add(new MyClass() { Id = null, VMId = 44, Name = "Test43" });
newR.Add(new MyClass() { Id = null, VMId = 55, Name = "Test5" });
newR.Add(new MyClass() { Id = null, VMId = 66, Name = "Test6" });

我想用上面的方法来匹配 VMId 属性上的两个列表。接下来我想检查 Name 属性是否已从 oldR 更改为 newR。

基本上我现在想,应该从数据库中删除 Test1,应该添加 Test6,并且应该将 Test4 更新为 Test43。

希望它有意义

编辑:我应该提一下,我的真实类(class)有 +20 个属性。我想现在如何使用 linq 进行比较,而不是全部指定?也许只是排除我不想比较的 Id 属性

我怎样才能做到这一点?

最佳答案

在 C# 中有几种标准方法可以执行此类操作。

如果你能控制被比较的类,你可以让它实现 IEquatable<T> 接口(interface)并重载 Object.Equals定义如何比较实例的方法。您还应该覆盖 Object.GetHashCode确保 Dictionary 中的平等s 和其他哈希集合正常工作。

例子:

class MyClass : IEquatable<MyClass> {

public string name;
public int primaryKey;

//IEquatable<T> implementation
public bool Equals(MyClass other) =>
!Equals(other, null)
&& other.name == this.name;

//Overriding Object methods
public override bool Equals(object other) =>
Equals(other as MyClass);

public override int GetHashCode() => name.GetHashCode();
}

如果您无法控制该类,您可以创建一个实现 IEqualityComparer<T> 的类接口(interface),它可以比较另一个类的实例。

例子:

class MyComparer : IEqualityComaprer<MyClass> {
public bool Equals(MyClass a, MyClass b) {
if (Object.Equals(a, null)) return Object.Equals(b, null);
if (Object.Equals(b, null)) return false;
return a.name == b.name;
}

public int GetHashCode(MyClass obj) => obj.name.GetHashCode();
}

许多标准 LINQ 运算符都有重载接受 IEqualityComparers作为元素比较的额外参数。

关于C# 获取两个匹配列表的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41009083/

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