gpt4 book ai didi

c# - 在干净地忽略 0 的同时使用 Linq 进行平均

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:27 25 4
gpt4 key购买 nike

我有一个 linq 语句,它对 DataTable 中的行进行平均,并将它们显示在图表上,并按日期和时间分组。

有 1 个大问题:由于一天中的特定时间根本没有任何事情发生,因此返回了许多 0 值。这些扭曲了我的平均水平,这很糟糕

一天中的不同时间可能在不同的列中有 0,所以我不能只删除列中有 0 的每一行(干净地),因为我最终会在数据表中没有留下任何行,或者至少我无论如何都想不出一个干净的方法来做到这一点。

这是我的:

            var results = from row2 in fiveDayDataTable.AsEnumerable()
group row2 by ((DateTime)row2["TheDate"]).TimeOfDay
into g
select new
{
Time = g.Key,
AvgItem1 = g.Average(x => (int)x["Item1"]),
AvgItem2 = g.Average(x => (int)x["Item2"]),
AvgItem3 = g.Average(x => (int)x["Item3"]),
AvgItem4 = g.Average(x => (int)x["Item4"]),
AvgItem5 = g.Average(x => (int)x["Item5"]),
};

我不知道这是否可行,所以我想我会问 - 有没有办法在没有 0 的情况下求平均值?

谢谢!

最佳答案

当然你可以过滤掉零:

AvgItem1 = g.Select(x => (int)x["Item1"]).Where(x => x != 0).Average(),
AvgItem2 = g.Select(x => (int)x["Item2"]).Where(x => x != 0).Average(),
AvgItem3 = g.Select(x => (int)x["Item3"]).Where(x => x != 0).Average(),
AvgItem4 = g.Select(x => (int)x["Item4"]).Where(x => x != 0).Average(),
AvgItem5 = g.Select(x => (int)x["Item5"]).Where(x => x != 0).Average(),

如果您的结果集(在 Where 之后)可能为空,您可能需要调用 DefaultIfEmpty .

AvgItem1 = g.Select(x => (int)x["Item1"]).Where(x => x != 0).DefaultIfEmpty(0).Average(),

这将返回一个非空结果集,因此您的 Average 将能够使用它。

关于c# - 在干净地忽略 0 的同时使用 Linq 进行平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024329/

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