在Linq查询的where子句中调用布尔方法

时间:2013-06-06 17:04:52

标签: c# linq methods

我在Linq中有一个调用where子句中的方法的查询... 这是代码:

it = {my iter}
{
   ...
   return from l in lifts
          where(compare(l.Trip.Start, it.Start, startRadius)) 
          select l;
}

private bool compare(POI a, POI b, int radius)
{
    return (((b.Position.X.Value - radius < a.Position.X.Value) 
              && (a.Position.X.Value < b.Position.X.Value + radius))
              && ((b.Position.Y.Value - radius < a.Position.Y.Value)
              && (a.Position.Y.Value< b.Position.Y.Value + radius)));
}

但每次所有升降机列表都会返回查询。为什么方法比较每次都返回true? 哪里我错了? 谢谢

1 个答案:

答案 0 :(得分:2)

您的数据或compare方法存在问题。 where的工作原理并不神奇。我敢打赌,如果你在return false方法中放置compare,则返回的列表将为空。

更新:如果您在查询执行时不确定it.Start值,那么您应该考虑@Jacob Proffitt回答(我不知道为什么它会关闭 - 投票)。

尝试用简单的foreach循环替换LINQ查询,并使用调试器逐步执行代码。

正如评论中所建议的,在compare方法中,您可能想要测量两个点是否在某个范围内。所以:

double x1 = a.Position.X.Value; 
double y1 = a.Position.Y.Value; 
double x2 = b.Position.X.Value; 
double y2 = b.Position.Y.Value; 

return ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) < (r*r);