gpt4 book ai didi

c# - 根据特定属性比较两个列表

转载 作者:行者123 更新时间:2023-11-30 14:58:05 24 4
gpt4 key购买 nike

我如何比较 2 个列表并根据具体属性获得不匹配的项目

public partial class Cable : StateObject
{
public int Id { get; set; }
public int CablePropertyId { get; set; }
public int Item { get; set; }
public int TagNo { get; set; }
public string GeneralFormat { get; set; }
public string EndString { get; set; }
public string CableRevision { get; set; }
}

我想根据 CablePropertyId、TagNo 和 CableRevision 完成比较,如果我使用的话

var diffCables = sourceCables.Except(destinationCables).ToList();

所有属性相互比较。我该怎么做?

最佳答案

将 Linq except 方法与自定义 EqualityComparer 结合使用。

http://msdn.microsoft.com/en-us/library/bb336390(v=vs.110).aspx

class CableComparer : IEqualityComparer<Cable>
{
public bool Equals(Cable x, Cable y)
{
return (x.CablePropertyId == y.CablePropertyId && ...);
}

public int GetHashCode(Cable x) // If you won't create a valid GetHashCode based on values you compare on, Linq won't work properly
{
unchecked
{
int hash = 17;
hash = hash * 23 + x.CablePropertyID;
hash = hash * 23 + ...
}
return hash;
}
}

var diffCables = sourceCables.Except(destinationCables, new CableComparer());

此外,ToList() 对结果的操作并不是真正必要的。大多数时候,您可以只对 Linq 查询 IEnumerable 的结果进行操作,而无需指定确切的类型;这样您就不会在不需要的 ToList() 操作上浪费性能。

顺便说一句,其他一些人提出了使用简单 lambda 的基于 Where 的查询。这样的解决方案更易于阅读(在我看来),但它也不太优化:它强制进行 n^2 检查,而 IEqualityComparer 允许 Linq 更优化,因为 GetHashCode() 方法。这是一个 great answer on importance of GetHashCode , 这是一个 great guide on writing GetHashCode() override .

关于c# - 根据特定属性比较两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19790211/

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