2

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

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

    public int[] locationScheme{get;set;}

    public double crowdingDistance{get;set;}
}

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

任何建议(包括参考资料或代码)都将受到高度赞赏。提前致谢。

4

3 回答 3

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 指南。覆盖平等并不是那么简单,尽管它并不复杂。例如,您将拥有所有具有相同元素的数组:

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));
}

数组相等的实现取自这里。您可以使用此参考对其进行优化。

于 2012-09-17T15:02:39.843 回答
1

As stated in the docs, Distinct uses the default equality comparer by default. That default equality comparer recognizes each of the items in your list as distinct from all others because it checks on instance identity.

As stated in the aforementioned docs, in order to compare a custom type and define equality like you want, you will need to implement some comparison-related methods on your class:

To compare a custom data type, you need to implement [IEquatable<T>] and provide your own GetHashCode and Equals methods for the type.

于 2012-09-17T14:55:20.577 回答
0

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

请参阅 MSDN 上的以下内容:

于 2012-09-17T14:59:44.447 回答