Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中删除重复项_C#_List_Multidimensional Array_Duplicates - Fatal编程技术网

C# 从列表中删除重复项

C# 从列表中删除重复项,c#,list,multidimensional-array,duplicates,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 <

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

这是我的密码:

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;
    }
期望输出:

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

double[]的长度始终为2

因为您已经声明数组的大小始终为2,所以我建议您使用不同的数据类型。例如,将更合适,因为它们实际上是成对的值

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

列表对=新列表//C 7.1+

列表对集合=新列表;//C7或以下

以这种方式播种:

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();
你可以用


循环时不要删除,最好存储重复索引

list.RemoveAtb;实际上删除了列表中的整个double[]数组,而不仅仅是一个重复的元素。这是故意的吗?你能用LINQ吗?如果是这样的话,您是否查看了IEnumerable.Distinct?老实说,您的代码似乎很难理解,为什么要在每个循环中检查两个不同的值?你能给我们提供一些条目和预期的输出吗?与其循环两次先获取元素然后删除它,也许ContainsDupes可以返回副本,如果没有,则返回null。那么while可以是这样的:double[]temp;而temp=ContainsDupeslist!=空列表。Removetemp;因为数组是引用类型,所以单个distinct将不起作用。例如,您必须将它们转换为元组列表,因为元组是值类型,因此可以比较值,而不是引用。第二种方法是一种很好且干净的解决方案,不过OP最终还是需要返回列表的方法。@StackLloyd一切都很好,我用foreach和一分钟左右的googlingI转换了元组,我现在已经重写了元组的程序,我发现从数组中删除重复可以很容易地完成array.Distinct.ToArray
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();
var l = new List<int[]>(){
            new int[]{5,4,3},
            new int[]{5,4,3},
            new int[]{5,4,2},
            };

            var indexStore = new List<int>();

            for (int i = 0; i < l.Count - 1; i++)
            {
                for (int x = i + 1; x < l.Count-1; x++)
                {
                    if (l[i].SequenceEqual(l[x]))
                    {
                        indexStore.Add(x);
                    }
                }
            }

            foreach (var index in indexStore)
            {
                l.RemoveAt(index);
            }