【问题标题】:Remove Duplicate Items from a List Containing a Class with Array Elements从包含具有数组元素的类的列表中删除重复项
【发布时间】:2012-09-09 19:40:34
【问题描述】:

我有一个包含某个类的对象的列表。包含各种项目的类,包括 int 和 double 数组。这个类看起来像这样。

public class NewChildren
{
    public double[] fitnessValue{get;set;}

    public int[] locationScheme{get;set;}

    public double crowdingDistance{get;set;}
}

由于列表可能包含重复项,我有兴趣删除它们。在网上,我看到了一些基于 Linq 的解决方案,它们使用 Distinct() 和 GroupBy() 方法。但是,这些方法似乎不起作用,因为对象中有数组(MSVS2008不会给出任何错误,但也不会删除任何项目)。

非常感谢任何建议(包括参考资料或代码)。提前致谢。

【问题讨论】:

    标签: c# list duplicate-removal


    【解决方案1】:

    您必须问自己的问题是,NewChildren 的两个实例何时相同?由于您在那里有列表,因此这可能不是一个容易回答的问题。当你定义了这个,你必须在你的类中实现相等方法:

    public class NewChildren
    {
        public double[] fitnessValue{get;set;}
    
        public int[] locationScheme{get;set;}
    
        public double crowdingDistance{get;set;}
    
        public bool override Equals(object other)
        {
            // ... implement your rules for equality here
        }
    }
    

    现在,要这样做,您必须始终关注Microsoft guidelines。压倒一切的平等并不是那么简单,尽管它并不复杂。例如,您将拥有所有具有相同元素的数组:

    public bool override Equals(object other)
    {
        if (other == null || !(other is NewChildren)) 
        {
            return false;
        }
    
        var another = (NewChildren)other;
    
        return AreEquivalent(this.fitnessValue, another.fitnessValue)
            && AreEquivalent(this.locationScheme, another.locationScheme)
            && AreEquivalent(this.crowdingDistance, another.crowdingDistance);
    
    }
    
    public static bool AreEquivalent<T>(T[] a, T[] b)
    {
        return a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a));
    }
    

    数组相等的实现取自here。您可以使用this reference 对其进行优化。

    【讨论】:

    • 谢谢。您编写 Equals 方法的简单示例使我找到了正确的方向并解决了我的问题。
    • @Ehsan,没问题!我是来帮忙的。只是不要忘记遵循 Microsoft 指南并覆盖 GetHashCode。您可能还想覆盖 operator==(只需委托给 Equals)。
    【解决方案2】:

    docs 中所述,Distinct 默认使用默认相等比较器。该默认相等比较器将列表中的每个项目识别为与所有其他项目不同,因为它会检查实例身份。

    如上述文档中所述,为了比较自定义类型并根据需要定义相等性,您需要在您的类上实现一些与比较相关的方法:

    要比较自定义数据类型,您需要实现 [IEquatable&lt;T&gt;] 并为该类型提供自己的 GetHashCodeEquals 方法。

    【讨论】:

      【解决方案3】:

      默认情况下,通过检查引用相等来评估从类创建的对象的 Equals 方法和相等运算符。这意味着只有当它们引用同一个类的实例时,两个项目才相等。您要么需要更改查询以检查类中的各个属性,要么实现适当的方法和运算符的覆盖。

      请参阅 MSDN 上的以下内容:

      【讨论】:

      • 感谢您的澄清和参考。
      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多