Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 如何基于自定义条件使用LINQ删除列表中的重复元素?_C#_.net_Linq - Fatal编程技术网

C# 如何基于自定义条件使用LINQ删除列表中的重复元素?

C# 如何基于自定义条件使用LINQ删除列表中的重复元素?,c#,.net,linq,C#,.net,Linq,我试图消除列表中符合特定条件的所有元素。具体来说,我有一个点列表,我需要过滤该列表,以便从列表中删除重复的点(注意,对于本项目而言,在另一个点的某个阈值内的点被视为相同的点,因此是重复的)。我一直在尝试使用LINQ来做到这一点,但我一直有一些应该被消除的分数(根据我的情况)。我的代码如下: var fingers = from p1Index in Enumerable.Range(0, fingAux.Count()) from p2 in fingAux.Skip

我试图消除列表中符合特定条件的所有元素。具体来说,我有一个点列表,我需要过滤该列表,以便从列表中删除重复的点(注意,对于本项目而言,在另一个点的某个阈值内的点被视为相同的点,因此是重复的)。我一直在尝试使用LINQ来做到这一点,但我一直有一些应该被消除的分数(根据我的情况)。我的代码如下:

var fingers = from p1Index in Enumerable.Range(0, fingAux.Count())
              from p2 in fingAux.Skip(p1Index + 1)
              let p1 = fingAux.ElementAt(p1Index)
              where (p1.X > p2.X + tresh) || (p1.X < p2.X - tresh)
              select p1;
var fingers=来自Enumerable.Range(0,fingAux.Count())中的p1Index
从fingAux.Skip中的p2开始(p1Index+1)
设p1=fingAux.ElementAt(p1Index)
其中(p1.X>p2.X+tresh)| |(p1.X
我做错了什么?

代码的问题是,您选择的点与至少一个点的距离超过了
tresh

你的方法的问题是“相等”必须是可交换的,这意味着如果
pA==pB
pB==pC
,那么
pA==pC
。如果你的条件是“在
tresh
内的点彼此相等”,那么你有一个问题,因为我可以有三个点A、B和C,它们彼此在
tresh
内,但A和C不是

e、 g.如果
tresh
为5,且我有点A=3、B=7和C=9,则A和B“相等”,B和C“相等”,但A和C不相等

另一种选择是将每个点“四舍五入”到最近的
tresh
并将其分组,从每组中选择第一个:

fingAux.GroupBy(p => Math.Round(p1.X / tresh))  // assuming X and/or tresh are floating-point
       .Select(g => g.First());   // take the first point of each group
试试这个:

var filtered = from p in fingAux
           where !(fingAux.Any(f1 => p.X < (f1.X + tresh)) select p
var filtered=来自fingAux中的p
哪里(fingAux.Any(f1=>p.X<(f1.X+tresh))选择p

只需更换这一行:

where (p1.X > p2.X + tresh) || (p1.X < p2.X - tresh)
其中(p1.X>p2.X+tresh)| |(p1.X
用这条线

where (p1.X < p2.X + tresh) && (p1.X > p2.X - tresh))
where(p1.Xp2.X-tresh))

基本上,如果某些代码与您想要的正好相反,请尝试反转运算符。

如果您提供一个简短但完整的示例来演示问题,这将非常有帮助……如果您想消除重复的机会,为什么不使用哈希集?为什么要生成p1Index?作为使用哈希集的替代方案,为什么不使用
Distinct
操作符?假设你有三个点11、12和15,如果我的条件是当有两个点的差值为1时,只需要取1点,那么应该选择11和15,但如果有OR条件,11和12都会被过滤…@SidharthPanwar OP表示他的代码只给出了他/她想要消除的元素。。。哦,我明白你的意思了。我颠倒了错误的东西。。。早晨的咖啡还没有开始……咖啡是“程序员的长生不老药”: