通过选择两个列表相等的对象来创建新列表

本文关键字:列表 对象 创建 新列表 两个 选择 | 更新日期: 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查询)。