【发布时间】:2011-11-11 17:40:29
【问题描述】:
我有一个显示Equipments 集合的 WPF 组件。这些Equipments 中的每一个都包含一个或多个Coordinate。在我的组件上的MouseMove 上,调用一个函数来检查鼠标当前是否悬停在任何Equipment 的任何Coordinate 的范围内。如果是这样,则返回有问题的Equipment,指示应显示一个包含有关Equipment 的文本信息的弹出窗口。
除此之外,所有Coordinates 都包含一个ImageDrawing,它为每个Equipment 显示一个符号(用户将鼠标悬停在该符号上以查看文本弹出窗口)。这些被放在一个单独的DrawingGroup 中以加快渲染速度。这样做的另一个好处是,如果要隐藏某些Equipments,我们可以从DrawingGroup 中删除它们的Coordinates' ImageDrawing,它们仍将保留在Equipments 列表中(应该如此)。
但是,当鼠标悬停在 Coordinate 上时,这并不妨碍弹出窗口的显示,因为它与 DrawingGroup 是分开的。因此,要检查是否要显示文本弹出窗口,我必须检查鼠标是否在任何 Coordinate 的范围内,还要检查 ImageDrawing 的 Coordinate 是否在 @ 987654342@.
关于我的问题(tl;dr):迭代所有这些项目的哪种方式最快?我有:
List<Equipment> equipments;
并且对于其中的每一个(此列表中有 10 次中有 9 次包含一项,并且永远不会超过 5 项)
List<Coordinate> coordinates;
对于每个Coordinates,我必须检查他们的ImageDrawing 是否在DrawingCollection(在本例中为DrawingGroup.Children),根据msdn,它是ordered collection of Drawing objects.
为此,我从以下开始:
foreach (Equipment equipment in equipments)
{
foreach (Coordinate coordinate in equipment.Coordinates)
{
ImageDrawing image = coordinate.ImageDrawing;
if (image != null)
{
if (currentDrawingGroup.Children.Contains(image))
{
if (image.Rect.Bottom > y &&
image.Rect.Top < y &&
image.Rect.Left < x &&
image.Rect.Right > x)
{
return equipment;
}
}
}
}
}
但是认为在隐藏了很多设备的情况下这会变成多次迭代,我可以将其更改为这样(因为 Children.Contains(image) 无论如何都会在幕后迭代):
foreach (var child in currentDrawingGroup.Children)
{
foreach (Equipment equipment in equipments)
{
foreach (Coordinate coordinate in equipment.Coordinates)
{
ImageDrawing image = coordinate.ImageDrawing;
if (image != null)
{
if (image == child)
{
if (image.Rect.Bottom > y &&
image.Rect.Top < y &&
image.Rect.Left < x &&
image.Rect.Right > x)
{
return equipment;
}
}
}
}
}
}
我知道这个问题太长了,从长远来看,我在这里看到的优化可能并不重要。但是有没有办法在没有这么多循环的情况下做到这一点?我觉得应该有一个 LINQ 表达式在某个地方帮助我,尽管我不知道其中任何一个是否比 foreach 循环更快。事物的排序方式(Equipments 被从 DrawingGroup 中删除等隐藏起来)超出了我的控制范围,而且很难改变。提前非常感谢。
【问题讨论】:
-
您是否使用
System.Diagnostics.Stopwatch评估过您的方法?这样您就可以知道哪种方法最快。 -
那么你到底想要什么?更少的代码或更快的运行时间?
-
我想我的问题有两个方面:我主要关心的是可读性,但我不希望它的性能成本太大。我可能希望有一个比我想出的任何解决方案都更具可读性的解决方案。我会用秒表看看有什么不同!
标签: c# .net wpf optimization