通过选择两个列表相等的对象来创建新列表
本文关键字:列表 对象 创建 新列表 两个 选择 | 更新日期: 2023-09-27 17:59:58
我有两个列表,StockOld&StockNew。它们是一种称为"库存"的自定义类型。股票有5个属性,但就我的目的而言,如果这两个属性,isin&两个列表中的区域相同,则应将对象视为相等。我想要的是创建一个新的列表,选择StockOld&StockNew。希望下面的例子能帮助说明我的意思。
StockOld StockNew Result I would like
ISIN Region ISIN Region ISIN Region
ABC1 UK DFG3 EU ABC1 UK
ERT4 US ABC1 UK LMN8 EU
LMN8 EU PLK2 EU
LMN8 EU
我已经创建了一个实现IEqualityComparer的比较器类,请参阅下面的内容。
public class ComparerISINRegion : IEqualityComparer<Stock>
{
public bool Equals(Stock x, Stock y)
{
return x.ISIN == y.ISIN && x.Region == y.Region;
}
public int GetHashCode(Stock obj)
{
int hash = 17;
hash = hash * 23 + (obj.ISIN ?? "").GetHashCode();
hash = hash * 23 + (obj.Region ?? "").GetHashCode();
return hash;
}
}
您可以使用Intersect
来提取两个列表之间的"相等"元素:
var newLst = StockOld.Intersect(StockNew, new ComparerISINRegion());
如果这确实是比较Stock的唯一方法,我建议您重写实际Stock类上的Equals运算符(请参阅MSDN:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx)。这将更好地遵循OOP实践,因为您的自定义Stock类现在将包含Equals和GetHashCode方法。
一旦这些方法被覆盖,您可以使用LINQ通过以下方式形成一个新列表:
IList<Stock> newList = list1.Intersect(list2);
或者,可以避免重写这些方法,并将特定属性与LINQ where或join子句进行比较(请参见Intersect LINQ查询)。