我有两个名单,StockOld& StockNew。它们是一种名为“Stock”的自定义类型。股票有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;
}
}
答案 0 :(得分:3)
您可以使用Intersect
提取两个列表之间的“相等”元素:
var newLst = StockOld.Intersect(StockNew, new ComparerISINRegion());
答案 1 :(得分:1)
如果这是您希望比较股票的唯一方式,我建议您覆盖实际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 query)。