为了账号安全,请及时绑定邮箱和手机立即绑定

在单次迭代中从整数列表中获取多个聚合结果的正确 Linq 语法是什么

在单次迭代中从整数列表中获取多个聚合结果的正确 Linq 语法是什么

C#
慕森王 2021-07-09 14:15:33
我有一个整数列表,我想使用 Linq 语法计算:Count、Max、Min、Average。我知道以下一切正常:var avg = list.Average(); var max = list.Max();等等。但是我无法找出在一次迭代中执行此操作的正确 Linq 语法,即等效于 SQL:select Min(value), Max(value), Avg(value) from list
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

如果您的列表是src,则可以使用ValueTupleandAggregate来创建一个难以阅读的循环:


var ans = src.Aggregate((Count: 0, Min: Int32.MaxValue, Max: Int32.MinValue, Sum: 0),

                        (g, v) => (g.Count+1, v < g.Min ? v : g.Min, v > g.Max ? v : g.Max, g.Sum+v));

var count = ans.Count;

var min = ans.Min;

var max = ans.Max;

var avg = ans.Sum / (double)(ans.Count == 0 ? 1 : ans.Count);

当然,如果这是你可能经常想做的事情,你可以为它创建一个扩展方法:


public static class IEnumerableExt {

    public static (int Count, int Min, int Max, double Average) Stats(this IEnumerable<int> src) {

        var a = src.Aggregate((Count: 0, Min: Int32.MaxValue, Max: Int32.MinValue, Sum: 0),

                              (g, v) => (g.Count + 1, v < g.Min ? v : g.Min, v > g.Max ? v : g.Max, g.Sum + v));

        return (a.Count, a.Min, a.Max, a.Sum / (double)(a.Count == 0 ? 1 : a.Count));

    }

}

循环版本更冗长,但可以说更容易理解:


public static (int Count, int Min, int Max, double Average) Stats2(this IEnumerable<int> src) {

    var count = 0;

    var min = Int32.MaxValue;

    var max = Int32.MinValue;

    var sum = 0;


    foreach (var i in src) {

        ++count;

        if (i < min)

            min = i;

        if (i > max)

            max = i;

        sum += i;

    }


    return (count, min, max, sum / (double)(count == 0 ? 1 : count));

}


查看完整回答
反对 回复 2021-07-11
?
精慕HU

TA贡献1845条经验 获得超8个赞

那这个呢?在选择之前,订单列表 ASC 会很有用


List<double> list = new List<double>() { 15,116,17,21,333,44,55,11};


double max = 0;

double min = 0;

double avg = list.OrderBy(x => x).Select((x, index) => index == 0 ? min = x : max = x).Average();

希望有所帮助,


查看完整回答
反对 回复 2021-07-11
  • 2 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信