gpt4 book ai didi

c# - 比较相同用户定义类型的两个列表

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

我有这样的数据集

cpeid                                cveid             LastEdited
cpe:/o:microsoft:windows_8.1:- CVE-2015-0001 2017-01-28 17:03:21.197
cpe:/o:microsoft:windows_8:- CVE-2015-0001 2017-01-28 17:03:21.197
cpe:/o:microsoft:windows_rt:-:gold CVE-2015-0001 2017-01-28 17:03:21.197

和这样的支持实体:

public partial class cve_cpe
{
[StringLength(250)]
public string cpeid { get; set; }

[Key]
[Column(Order = 0)]
[StringLength(250)]
public string cveid { get; set; }

[Key]
[Column(Order = 1, TypeName = "smalldatetime")]
public DateTime LastEdited { get; set; }
}

我在一个简单的 C# 控制台应用程序中使用 entityframework 对数据库进行基本处理。我在代码的某处这样做:

var mappings_to_add =  distinct_mappings_from_file
.Except(all_mappings, new cve_cpeComparer())
.ToList();

我的 IEqualityComparer 实现是:

    class cve_cpeComparer : IEqualityComparer<cve_cpe>
{
public bool Equals(cve_cpe x, cve_cpe y)
{
if (object.ReferenceEquals(x, y))
return true;
if (x == null || y == null)
return false;
return x.cpeid == y.cpeid && x.cveid == y.cveid;
}

public int GetHashCode(cve_cpe obj)
{
return obj.cveid.GetHashCode() ^ obj.cpeid.GetHashCode();
}
}

但它不会简单地起作用。我尝试了各种关于实现 GetHashCode 的建议,在实体和数据库中设置正确的键,从数据库中手动删除重复项,但它根本不起作用。我在这里缺少什么?

所以基本上,我希望 linq .Except 给我列表中那些不存在于 db 中的条目,即忽略那些具有相同 cveid 组合的条目> 和 cpeid 已经在数据库数据列表中。

有趣的是,这个东西与我的许多其他用户定义类型一起工作,它们具有 IEqualityComparer 的风格(逻辑上相同实现),所以想知道我做错了什么?是不是跟这些带符号的字符串的值有关?

更新

所以它现在可以工作了,事实证明,这是因为实体和模型构建器中的错误 pk 配置,修复解决了问题。但现在我想知道为什么 LINQ .Except 甚至担心主键,特别是当我给它提供自定义 IEqualityComparer 时?

最佳答案

我不小心进入了这个页面,IEqualityComparer.GetHashCode 实现引起了我的注意。想象一下下面的代码:

var list = new List<cve_cpe>
{
new cve_cpe { cpeid = "1", cveid = "2" },
new cve_cpe { cpeid = "2", cveid = "1" }
};

var result = list.Except(list, new cve_cpeComparer()).ToList();

如果执行上述代码,Equals 方法将被调用 4 次,因为 GetHashCode 将为两个对象返回相同的值。通过更改 GetHashCode 的实现,这可以减少到 2 倍:

public int GetHashCode(cve_cpe obj)
{
return obj.cveid.GetHashCode() * 11 /*Any prime number*/ ^ obj.cpeid.GetHashCode();
}

关于c# - 比较相同用户定义类型的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41909545/

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