删除List <list <double []>&gt;中删除的所有内容。

时间:2015-06-24 14:03:59

标签: c# list duplicates

我希望你能帮我解决这个问题。我有列表&lt;列表&lt; double []&gt; &gt; ,我想删除此列表中重复的所有内容。那就是:

1)在列表&lt; double []&gt; 有一些 double [] 是重复的。我想只保留List&lt;中的非重复的double [] double []&gt;。见图中的清单1和5.

2)在列表&lt;列表&lt; double []&gt; &gt; 有一些列表&lt;双重[]&gt; 是重复的。我想只保留非重复列表。见列表0&amp; 2并列出1&amp; 3。

图片中指定了所需的输出:

enter image description here

我尝试了以下但不起作用。

public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
{
    var output = new List<List<double[]>>();

    for (int i = 0; i < input.Count; i++)
    {
        var temp= input[i].Distinct().ToList();
        output.Add(temp);
    }
    return output.Distinct().ToList();
}

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您的代码(ToList收藏家除外)在逻辑上等同于:

return input.Select(t => t.Distinct()).Distinct();

您正在尝试对集合使用Distinct。这是合理的,因为您希望获得不同的集合

问题是你没有逻辑离开Distinct来比较这些集合。在没有指定逻辑的情况下,Distinct无法正确地比较集合(通过每个成员的相等性)。

还有Distinct的另一个重载,它以IEqualityComparer<T>为参数。要使用它,您必须首先实现这样的比较器。合理的实现(改编自Cédric Bignon's answer)可能如下所示:

public class ArrayComparer<T> : IEqualityComparer<T[]>
{
    public bool Equals(T[] x, T[] y)
    {
        return ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y));
    }

    public int GetHashCode(T[] obj)
    {
        return 0;
    }
}

public class ListOfArrayComparer<T> : IEqualityComparer<List<T[]>>
{
    public bool Equals(List<T[]> x, List<T[]> y)
    {
        return ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y, new ArrayComparer<T>()));
    }

    public int GetHashCode(List<T[]> obj)
    {
        return 0;
    }
}

您的代码应如下所示:

    public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
    {
        var output = new List<List<double[]>>();

        for (int i = 0; i < input.Count; i++)
        {
            var temp = input[i].Distinct(new ArrayComparer<double>()).ToList();
            output.Add(temp);
        }
        return output.Distinct(new ListOfArrayComparer<double>()).ToList();
    }

甚至只是:

    public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
    {
        var output = input.Select(t => t.Distinct(new ArrayComparer<double>()).ToList()).ToList();

        return output.Distinct(new ListOfArrayComparer<double>()).ToList();
    }

请记住,如果您使用更具体的类型来描述您的问题,这将会复杂得多。

例如,如果您使用更具体的对类型(如double[])而不是Tuple<double, double>,则只需要实现一个比较器(第一个Distinct调用可以保留其默认行为,如果我没记错的话。)

如果你有一个专门的List<double>而不是PairCollection来实现它自己的平等方法,你也不需要第二个相等比较器(你原来的代码就像它已经工作一样)是,最有可能)。

因此,为了避免将来出现此类问题,请尝试为您的问题声明特殊类型(而不是依赖于通用列表和数组,并像这里一样嵌套它们)。