从List <double []>中删除重复项

Tru*_*CP5 2 c# list duplicates multidimensional-array

我正在尝试从双精度数组列表中删除重复项。我想保留重复的第一个实例,但删除之后找到的所有实例。

这是我的代码:

private static List<double[]> RemoveDupes(List<double[]> locData)
    {
        List<double[]> list = locData;
        while (ContainsDupes(list))
            for (int a = 0; a < list.Count; a++)
                for (int b = 0; b < list.Count; b++)
                    if (a != b && list[a][0] == list[b][0] && list[a][1] == list[b][1])
                        list.RemoveAt(b);

        return list;
    }
private static bool ContainsDupes(List<double[]> list)
    {
        for (int a = 0; a < list.Count; a++)
            for (int b = 0; b < list.Count; b++)
                if (a != b && list[a][0] == list[b][0] && list[a][1] == list[b][1])
                    return true;
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

该方法几乎在所有时间都有效,但是它很慢,在极端情况下(几千分之一),它使我的程序崩溃,并在第6行出现了索引异常。将不胜感激。

输入:

{{45.5, 23.6}, {34.54, 98.34}, {45.5, 23.6}}
Run Code Online (Sandbox Code Playgroud)

所需的输出:

{{45.5, 23.6}, {34.54, 98.34}}
Run Code Online (Sandbox Code Playgroud)

(double []的长度始终为2)

Dar*_*dan 6

既然您已经说过数组的大小将始终为2,所以建议您使用其他数据类型。例如,元组会更合适,因为它们实际上是一对值。

例如,您可以定义对的集合:

List<(double, double)> pairs = new List<(double, double)>(); //C# 7.1+

List<Tuple<double, double>> pairsCollection = new List<Tuple<double, double>>(); // C# 7 or less

以这种方式播种:

pairs.Add((45.5, 23.6));
pairs.Add((34.54, 98.34));
pairs.Add((45.5, 23.6));
Run Code Online (Sandbox Code Playgroud)

然后,仅使用Distinctmethod即可删除重复项:

pairs.Distinct();
Run Code Online (Sandbox Code Playgroud)

这将输出:

{{45.5,23.6},{34.54,98.34}}

另外,如果您不能更改数据类型,则可以将集合投影为成对的集合,然后将其区分:

List<double[]> collection = new List<double[]>()
{
    new double[]{45.5, 23.6},
    new double[]{34.54, 98.34},
    new double[]{45.5, 23.6}
};
var pairs = collection.Select(pa => (pa[0], pa[1])); 
var distinctPairs = pairs.Distinct();
Run Code Online (Sandbox Code Playgroud)