C# 从包含双精度数组的arraylist中删除重复项

C# 从包含双精度数组的arraylist中删除重复项,c#,arraylist,duplicates,C#,Arraylist,Duplicates,我有一个列表,它有两个数组,其中的项是geocordinates,这个列表有重复的元素,我需要删除这些元素以只保留唯一的值 这就是我尝试过的 IList<double[]> result = new List<double[]>(); /list declaration // result gets value from a soap call for (int i = 0; i < result.Count; i++) { for (int j =

我有一个列表,它有两个数组,其中的项是geocordinates,这个列表有重复的元素,我需要删除这些元素以只保留唯一的值

这就是我尝试过的

IList<double[]> result = new List<double[]>(); /list declaration

// result gets value from a soap call 

for (int i = 0; i < result.Count; i++)
{
    for (int j = 0; j < result.Count; j++)
    {
         if (result[i][0].ToString() == result[j][0].ToString() || result[i][1].ToString() == result[j][1].ToString())
         {
             result.Remove(result[j]);
         }
    }
}  
IList结果=新列表()/列表声明
//结果从soap调用中获取值
for(int i=0;i
结果-具有冗余阵列的我的列表

基本上,我需要删除列表中具有相同值的所有数组(x和y geocordinates)

我仍然有一些元素在列表中重复,有人可以改进我的解决方案吗? 非常有帮助

试试这个:

result = result.GroupBy(r => new { val1 = r[0], val2 = r[1] })
               .Select(g => new double[] { g.Key.val1, g.Key.val2 }).ToList();
试试这个:

result = result.GroupBy(r => new { val1 = r[0], val2 = r[1] })
               .Select(g => new double[] { g.Key.val1, g.Key.val2 }).ToList();

本例将100英寸
数据
降至41英寸
数据唯一

Random r = new Random(99);
var data = new List<Tuple<decimal, decimal>>();
for (int i = 0; i < 100; i++)
{
    data.Add(new Tuple<decimal, decimal>(r.Next(7)/100m, r.Next(7)/100m));
}
var dataUnique = data.Distinct().ToList();
Random r=新随机数(99);
var data=新列表();
对于(int i=0;i<100;i++)
{
添加(新元组(r.Next(7)/100m,r.Next(7)/100m));
}
var dataUnique=data.Distinct().ToList();
编写代码:请注意,如果对这些数字使用了任何计算,则比较
float
double
将无法正常工作,因为二进制数不允许进行比较所需的精度作为第一项改进,务必将双精度
替换为十进制


使用
ToString()
可能有助于解决问题,也可能没有帮助;最好不要依赖它。

此示例将
数据中的100降到
数据中的41

Random r = new Random(99);
var data = new List<Tuple<decimal, decimal>>();
for (int i = 0; i < 100; i++)
{
    data.Add(new Tuple<decimal, decimal>(r.Next(7)/100m, r.Next(7)/100m));
}
var dataUnique = data.Distinct().ToList();
IList<double[]> result = new List<double[]>(); /list declaration

// result gets value from a soap call 

for (int i = 0; i < result.Count; i++)
{
    for (int j = i + 1; j < result.Count; j++)
    {
         if (result[i][0].ToString() == result[j][0].ToString() && result[i][1].ToString() == result[j][1].ToString())
         {
             result.Remove(result[j]);
             j--;
         }
    }
}  
Random r=新随机数(99);
var data=新列表();
对于(int i=0;i<100;i++)
{
添加(新元组(r.Next(7)/100m,r.Next(7)/100m));
}
var dataUnique=data.Distinct().ToList();
编写代码:请注意,如果对这些数字使用了任何计算,则比较
float
double
将无法正常工作,因为二进制数不允许进行比较所需的精度作为第一项改进,务必将双精度
替换为十进制

使用
ToString()
可能有助于解决问题,也可能没有帮助;最好不要依赖它。

IList result=new List()/列表声明
IList<double[]> result = new List<double[]>(); /list declaration

// result gets value from a soap call 

for (int i = 0; i < result.Count; i++)
{
    for (int j = i + 1; j < result.Count; j++)
    {
         if (result[i][0].ToString() == result[j][0].ToString() && result[i][1].ToString() == result[j][1].ToString())
         {
             result.Remove(result[j]);
             j--;
         }
    }
}  
//结果从soap调用中获取值 for(int i=0;i
IList结果=新列表()/列表声明
//结果从soap调用中获取值
for(int i=0;i
相同的地理坐标意味着x和y必须相等,因此将
|
更改为
&&
不起作用,但我仍然有重复项存在创建数组;然后保存有条件的数据,最后用旧数组替换新数组。即使您找到了问题的正确解决方案,我建议您改变方法。您可以将坐标定义为点类,而不是使用
double[]
。在
Point
类中,您可以重写
ToEquals
方法来检查重复项。我建议编写一个新类,其中decimal和decimal分别为X和Y,而不是使用
System.Windows
System.Drawing
中的现有点。使用这种方法,您将完全控制它以覆盖ToEquals方法。相同的地理坐标意味着x和y必须相等,因此将
|
更改为
&&
不起作用,但我仍然有重复项存在创建数组;然后保存有条件的数据,最后用旧数组替换新数组。即使您找到了问题的正确解决方案,我建议您改变方法。您可以将坐标定义为点类,而不是使用
double[]
。在
Point
类中,您可以重写
ToEquals
方法来检查重复项。我建议编写一个新类,其中decimal和decimal分别为X和Y,而不是使用
System.Windows
System.Drawing
中的现有点。使用这种方法,您将完全控制它以覆盖ToEquals方法。