如何使用一个linq查询获得总数量?

苏里亚·纳拉扬(Surya Narayan)

我有两个linq查询,一个要获取confirmedQty,另一个要获取unconfirmedQty

有获得的条件unconfirmedQty它应该是平均值而不是总和。

result = Sum(confirmedQty) + Avg(unconfirmedQty)

有什么方法可以只编写一个查询并获得所需的结果,而不是编写两个单独的查询?

我的密码

class Program
{
    static void Main(string[] args)
    {
        List<Item> items = new List<Item>(new Item[]
        {
            new Item{ Qty = 100, IsConfirmed=true },
            new Item{ Qty = 40, IsConfirmed=false },
            new Item{ Qty = 40, IsConfirmed=false },
            new Item{ Qty = 40, IsConfirmed=false },
        });

        int confirmedQty = Convert.ToInt32(items.Where(o => o.IsConfirmed == true).Sum(u => u.Qty));
        int unconfirmedQty = Convert.ToInt32(items.Where(o => o.IsConfirmed != true).Average(u => u.Qty));

        //Output => Total : 140
        Console.WriteLine("Total : " + (confirmedQty + unconfirmedQty));

        Console.Read();
    }

    public class Item
    {
        public int Qty { get; set; }
        public bool IsConfirmed { get; set; }
    }
}
谢尔盖·别列佐夫斯基(Sergey Berezovskiy)

实际接受的答案会枚举您的项目收集2N + 1时间,并且会为您的原始解决方案增加不必要的复杂性。如果我遇到了这段代码

(from t in items
 let confirmedQty = items.Where(o => o.IsConfirmed == true).Sum(u => u.Qty)
 let unconfirmedQty = items.Where(o => o.IsConfirmed != true).Average(u => u.Qty)
 let total = confirmedQty + unconfirmedQty
 select new { tl = total }).FirstOrDefault();

需要花费一些时间来了解将项目投影的数据类型是的,此查询是一个奇怪的预测。它创建SelectIterator要投影序列的每个项目,然后创建一些范围变量,其中涉及对项目进行两次迭代,最后选择第一个投影项目。基本上,您已将原始查询包装到其他无用的查询中:

items.Select(i => {
    var confirmedQty = items.Where(o => o.IsConfirmed).Sum(u => u.Qty);
    var unconfirmedQty = items.Where(o => !o.IsConfirmed).Average(u => u.Qty);
    var total = confirmedQty + unconfirmedQty;
    return new { tl = total };
}).FirstOrDefault();

意图深深地隐藏在代码中,并且您仍然具有相同的两个嵌套查询。您在这里可以做什么?您可以简化两个查询,使其更具可读性,清楚地表明您的意图

int confirmedTotal = items.Where(i => i.IsConfirmed).Sum(i => i.Qty);
// NOTE: Average will throw exception if there is no unconfirmed items!
double unconfirmedAverage = items.Where(i => !i.IsConfirmed).Average(i => i.Qty);
int total = confirmedTotal + (int)unconfirmedAverage;

如果性能比可读性更重要,那么您可以在单个查询中计算总数(出于可读性考虑,移至扩展方法):

public static int Total(this IEnumerable<Item> items)
{
    int confirmedTotal = 0;
    int unconfirmedTotal = 0;
    int unconfirmedCount = 0;

    foreach (var item in items)
    {
        if (item.IsConfirmed)
        {
            confirmedTotal += item.Qty;
        }
        else
        {
            unconfirmedCount++;
            unconfirmedTotal += item.Qty;
        }
    }

    if (unconfirmedCount == 0)
        return confirmedTotal;
    // NOTE: Will not throw if there is no unconfirmed items
    return confirmedTotal + unconfirmedTotal / unconfirmedCount;
}

用法很简单:

items.Total();

顺便说一句第二个解决方案,从接受的答案是不正确的。它返回正确的值只是一个巧合,因为所有未确认的项目都具有equal Qty此解决方案计算总和而不是平均值。分组的解决方案如下所示:

var total = 
    items.GroupBy(i => i.IsConfirmed)
         .Select(g => g.Key ? g.Sum(i => i.Qty) : (int)g.Average(i => i.Qty))
         .Sum();

在这里,您将项目分为两组-已确认和未确认。然后,您可以根据组键以及两个组值的汇总来计算总和或平均值。这也不是可读性也不高效率的解决方案,但这是正确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我有一个查询以时间间隔选择某些数据的总和,如何获得这些时间间隔的总数?

如何使用LINQ获得多个总数

获取结果列表,并在一个查询中获得总数

在一个查询中获取总数和缺勤总数

(SQL)如何在一个“客户名称”下聚合“总数量”值

如何使用一个SQL查询从两个表中获得结果?

Mongodb:如何使用一个查询获取不同集合中文档的数量?

如何使用MongoDB获得每个仓库中的总数量?

Mongodb-在一个查询中查询今天的总数,星期的总数和月份的总数

如何使用一个 db 往返执行两个 EF linq 查询

使用Linq合并两个列表并获得总数

是否有一个KQL查询来限制每个特定类别获得的子结果的数量?

如何每天只获得一个 SQL 查询?

如何找到一个文本文件中词的总数,元音的总数,特殊字符的总数使用Java 8

如何获得与作者相关的点赞总数,并在达到一定数量时使用它发送通知

LinQ查询计算另一个对象列表中一个对象列表中元素的数量

如何编写LINQ查询以使用C#从另一个对象获取对象?

如何创建一个完全动态的linq查询?

如何使用LINQ从另一个具有特定数量项的实体检索列表

用一个SQL查询更新总数

如何将两个变量组合为一个变量以获得大熊猫总数?

如何获得仅在一个组织中表达的基因数量

如何根据第一个用户输入获得可变数量的用户输入

在另一个linq查询中使用结果linq查询

如何在复杂查询中使用 linq 将一个表连接到另外两个表?

如何使用AJAX查询的最后一个ID查询?

如何使用react,typescript和graphql更新从单击另一个组件中的按钮的查询中获得的值?

如何将这两个linq查询合并为一个查询?

我有一个部分查询和部分方法的 LINQ 语句。我如何使用其中一个来做到这一点?