【发布时间】:2017-11-27 22:08:02
【问题描述】:
我正在编写一个函数,它接受一系列 System.Windows.Point 并返回一个 ValueTuple,其中包含所有点的边界 X 和 Y 值。这是为了确定图形轴的标签。
我正在尝试将我执行的列表的迭代次数减少到一次。经过大量的谷歌搜索,我已经适应(阅读:“复制”)一种类似下面的方法,我被告知可以做到这一点。但我不确定如何验证这一事实。我想知道是否有人更熟悉 LINQ 可以
- 确认以下函数确实只会迭代列表一次,即使它正在计算 4 个不同的值
- 如果是这样,请向我解释这是怎么回事。因为在我看来,正在构造的匿名类型在给定列表上每次调用两次“Min”和“Max”。为什么这不会导致 4 次迭代?
- 也许甚至可以解释一下我是如何自己验证发生的迭代次数的,这样以后我就不需要问这样的问题了。我不知道该怎么做。
我的 LINQ-Fu 还不强。
谢谢
/// <summary>
/// X and Y axis boundaries in the form of a System.ValueTuple.
/// </summary>
public (double MinX, double MaxX, double MinY, double MaxY)
GetBounds(List<System.Windows.Point> pts)
{
// Calculate the bounds with a LINQ statement. Is this one iteration or many?
var a = pts.GroupBy(i => 1).Select(
pp => new
{
MinY = pp.Min(p => p.Y),
MaxY = pp.Max(p => p.Y),
MinX = pp.Min(p => p.X),
MaxX = pp.Max(p => p.X)
}).FirstOrDefault();
return a != null ? (a.MinX, a.MaxX, a.MinY, a.MaxY) : (0, 0, 0, 0);
}
【问题讨论】:
-
要验证它,您可以实现自己的
IEnumerable<Point>,它会在迭代时写入控制台。 -
您不使用输入参数是否有原因?你怎么知道这个集合被迭代了多次?
-
首先,我很抱歉。 “ProfilePoints”应该是输入参数。我在最后一刻编辑了我的帖子。现在修好了。其次,我不知道它是否被多次迭代。这就是我想要确定的