【问题标题】:create new list by selecting objects where two lists are equal通过选择两个列表相等的对象来创建新列表
【发布时间】:2014-04-24 23:26:34
【问题描述】:

我有两个列表,StockOld 和 StockNew。它们是一种称为“库存”的自定义类型。 Stock 有 5 个属性,但出于我的目的,如果两个列表中的两个属性 isin 和 region 相同,则应将对象视为相等。如果创建一个新列表来选择 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;
        }
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用Intersect 提取两个列表之间的“相等”元素:

    var newLst = StockOld.Intersect(StockNew, new ComparerISINRegion());
    

    【讨论】:

      【解决方案2】:

      如果这确实是您希望比较 Stocks 的唯一方法,我建议您在实际的 Stock 类上覆盖 Equals 运算符(请参阅 MSDN:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx)。这将更好地遵循 OOP 实践,因为您的自定义 Stock 类现在将包含您的 Equals 和 GetHashCode 方法。

      一旦这些方法被覆盖,您就可以使用 LINQ 通过以下方式形成一个新列表:

      IList&lt;Stock&gt; newList = list1.Intersect(list2);

      或者,您可以避免覆盖这些方法,并将特定属性与 LINQ where 或 join 子句进行比较(请参阅Intersect LINQ query)。

      【讨论】:

        猜你喜欢
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 2021-05-13
        相关资源
        最近更新 更多