gpt4 book ai didi

.net - C# List.Find(x=>x.Rectangle.Contains(Point)) 失败

转载 作者:行者123 更新时间:2023-12-01 09:39:29 25 4
gpt4 key购买 nike

对于我的一生,我无法理解为什么这段代码会产生以下输出......

如果类型公开了 Rectangle 属性并且您使用了矩形对象的 Contains 方法,我认为在使用 List 和 lambda 时存在错误或其他问题......并且当 List Find 方法失​​败时显式迭代证明是正确的...... .

单程

代码

public GridSquare WorldToKeyPadSub(Point location)
{
location = _Map.WorldToClient(location);
GridSquare gs = this.Find(x => x.Rectangle.Contains(location));
GridSquare kp = gs.Find(x => x.Rectangle.Contains(location));
List<GridSquare> list = kp.FindAll(x=>x.Rectangle.Contains(location));
u.dp(list.Count);
GridSquare sub = kp.Find(x => x.Rectangle.Contains(location));

if (sub == null)
{
u.dp("Location to look for " + location);
u.dp("Found Location in grid square " + gs.ToString());
u.dp("grid square bounds " + gs.Rectangle.ToString());
u.dp("Found Location in Keypad " + kp.ToString());
u.dp("key pad bounds " + kp.Rectangle.ToString());
u.dp("Sub Key Pads Print All sub keys in this grid.keypad");
foreach (GridSquare t in kp)
{
u.dp(t.ToString() + " " + t.Rectangle.ToString());

}
u.dp("Sub Key Pads Print Explicit Finds");
foreach (GridSquare t in kp)
{
if (location.X >= t.Location.X
&& location.Y >= t.Location.Y
&& location.X <= t.Location.X + t.Rectangle.Width
&& location.Y <= t.Location.Y + t.Rectangle.Height)
{
u.dp(true);
u.dp(t.ToString() + " " + t.Rectangle.ToString());
}

}
}
return sub;
}

这会产生以下输出...

注意显式矩形(又名手动方法)如何找到包含该位置的网格正方形......内部 GDI 版本失败......

Location to look for {X=1476,Y=1716}
Found Location in grid square GS: 14.3.0.0
grid square bounds {X=1398,Y=1650,Width=100,Height=100}
Found Location in Keypad GS: 14.3.6.0
key pad bounds {X=1465,Y=1683,Width=33,Height=34}
Sub Key Pads Print All sub keys in this grid.keypad
GS: 14.3.6.7 {X=1465,Y=1683,Width=11,Height=11}
GS: 14.3.6.8 {X=1476,Y=1683,Width=11,Height=11}
GS: 14.3.6.9 {X=1487,Y=1683,Width=11,Height=11}
GS: 14.3.6.4 {X=1465,Y=1694,Width=11,Height=11}
GS: 14.3.6.5 {X=1476,Y=1694,Width=11,Height=11}
GS: 14.3.6.6 {X=1487,Y=1694,Width=11,Height=11}
GS: 14.3.6.1 {X=1465,Y=1705,Width=11,Height=11}
GS: 14.3.6.2 {X=1476,Y=1705,Width=11,Height=11}
GS: 14.3.6.3 {X=1487,Y=1705,Width=11,Height=11}
Sub Key Pads Print Explicit Finds
True
GS: 14.3.6.1 {X=1465,Y=1705,Width=11,Height=11}
True
GS: 14.3.6.2 {X=1476,Y=1705,Width=11,Height=11}
A first chance exception of type 'System.NullReferenceException'

最佳答案

Rectangle.Contains(Point)在矩形的上限上是排他的(严格小于)。

例如,Rectangle.Contains(Point) 执行的等效检查在您的上下文中是:

foreach (GridSquare t in kp) 
{
if (location.X >= t.Location.X
&& location.Y >= t.Location.Y
&& location.X < t.Location.X + t.Rectangle.Width // < instead of <=
&& location.Y < t.Location.Y + t.Rectangle.Height) // < instead of <=
{
u.dp(true);
u.dp(t.ToString() + " " + t.Rectangle.ToString());
}

}

如您所见,它将上限验证为严格小于,而不是小于或等于您的方法与 Rectangle.Contains(Point) 之间的差异。躺在那里。

在您的示例中传递的位置是 {X=1476,Y=1716},当传递给这些矩形的包含时:

GS: 14.3.6.1  {X=1465,Y=1705,Width=11,Height=11}  
GS: 14.3.6.2 {X=1476,Y=1705,Width=11,Height=11}

将返回 false,当您的返回 true 时。

这就是 kp.Find(x => x.Rectangle.Contains(location)); 的原因返回 null,但您的手动检查返回 true。

关于.net - C# List<T>.Find(x=>x.Rectangle.Contains(Point)) 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2197508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com