5

我有一个类似于 Point 的结构 TimePoint,除了 x 值是日期时间、这些时间点的可观察集合以及采用日期时间并返回双精度值的方法。

我想检索从该集合中的日期时间返回的双精度值的最大值和最小值。

我是 linq 的新手,无法弄清楚我必须传递可观察集合来实现这一点的查询。

这是我想要得到的:

double minDouble = 0;
double maxDouble = 0;

foreach(TimePoint item in obsColl)
{
    var doubleVal = ConvertToDouble(item.X); //Here x is a datetime
    if(minDouble > doubleVal)
        minDouble = doubleVal;
    if(maxDouble < doubleVal)
        maxDouble = doubleVal;
}

如何使用 LINQ 实现这一目标?或者 LINQ 不适合这个?

4

4 回答 4

4

您可以为此使用Max和:Min

double minDouble = obsColl.Min(item => ConvertToDouble(item.X));
double maxDouble = obsColl.Max(item => ConvertToDouble(item.X));
于 2012-11-15T07:34:55.617 回答
3

您可以查看此示例101 LINQ Samples

于 2012-11-15T07:44:07.413 回答
2

效率更高

    double minDouble =ConvertToDouble( obsColl.Min(item => item.X));
    double maxDouble = ConvertToDouble(obsColl.Max(item => item.X));
于 2012-11-15T07:39:19.070 回答
0

使用流利的断言包

    [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
    public void MyTestMethod()
    {
        var list = new List<double>() { 1, 3, 5, 2, 9, 4 };

        var minmax = from l in list
                     group l by 1 into g
                     select new
                     {
                         min = g.Min(),
                         max = g.Max()
                     };

        minmax.First().min.Should().Be(1);
        minmax.First().max.Should().Be(9);
    }

现在group l by 1 into g是一个 hack,因为 linq 不允许没有组的聚合,但它还不错

于 2012-11-15T09:05:02.433 回答