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

标签 c# list multidimensional-array duplicates

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

这是我的代码:

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

此方法几乎在所有时间都有效,但速度很慢,而且在极端情况下(几千分之一)它会使我的程序崩溃并在第 6 行出现索引异常。我想不出任何其他方法来做到这一点因此,我们将不胜感激。

输入:

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

期望的输出:

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

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

最佳答案

既然您声明数组的大小始终为 2,我建议您使用不同的数据类型。例如,tuple会更合适,因为这些实际上是成对的值。

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

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

然后,只需使用 Distinct方法,删除重复项:

pairs.Distinct();

这将输出:

{{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();

关于c# - 从 List<double[]> 中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326947/

相关文章:

c# - MVVX无法从MvxDefaultViewModelLocator初始化ViewModel

c# - protobuf-net 中 List<T> 的 .proto 等价物是什么?

c# - 自动夹具 + AutoMoq : Create mock with excluded property

python - 列表继承 : "extend" vs "+" vs "+="

html - Bootstrap : div inside li

javascript - 循环遍历 Javascript 数组

c# - 使用 Control+Plus 的快捷方式创建 MenuItem – 使用反射修改 MenuItem 的私有(private)字段是最好的方法吗?

c# - 从 List<Dictionary<string, string>> 获取唯一值

java - 二维位图在不正确的位置填充了对象 [作业]

具有对象指针的 byref 二维矩阵的 C++ 递归函数