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