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

时间:2014-04-24 14:56:25

标签: c#

我有两个名单,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;
        }
    }

2 个答案:

答案 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)。