C#Linq语句或foreach()用于总计子集?

Cap*_*sey 6 c# linq foreach

哪种解决方案更受青睐?

对于列表:

List<ExampleInfo> exampleList = new List<ExampleInfo>();

public class ExampleInfo
{
    internal ExampleInfo()
    { }
    /* Business Properties */
    public int Id { get; set; }
    public string Type { get; set; }
    public decimal Total { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望根据"总计"值得到小计.

选项1:

var subtotal1 = exampleList.Where(x => x.Type == "Subtype1").Sum(x => x.Total);
var subtotal2 = exampleList.Where(x => x.Type == "Subtype2").Sum(x => x.Total);
Run Code Online (Sandbox Code Playgroud)

选项2:

decimal subtotal1 = 0m;
decimal subtotal2 = 0m;
foreach (ExampleInfo example in exampleList)
{
    switch (example.Type)
    {
        case "Subtype1":
            subtotal1 += example.Total;
             break;
        case "Subtype2":
             subtotal2 += example.Total;
             break;
        default:
             break;

    }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,该列表将<10项.

编辑:克里斯提出了一个非常好的观点我没有提到.该程序已经在使用.NET Framework 3.5 SP1,因此兼容性不是一个重要的考虑因素.

Joe*_*oey 5

无论列表大小如何,如果你的目标是.NET 3.5,我会选择LINQ,只是为了便于阅读.

我非常喜欢写你的意思,而不是它是如何完成的,LINQ在这种情况下使这很容易.

您甚至可以将计算拉入单个LINQ语句,按类型分组.这样你就不会有两个LINQ循环,只有一个循环,如第二个例子:

var subtotals = from x in exampleList
                group x by x.Type into g
                select new { Type = x.Key, SubTotal = g.Sum(x => x.Total) };
Run Code Online (Sandbox Code Playgroud)

(不完全确定代码是否像它一样工作,它只是从101个LINQ示例中的一个快速适应.但语法应该没问题.)


Kob*_*obi 4

这两个示例都有重复的代码,并且都没有准备好进行更改Type- 如果它具有三个值怎么办?如果有 30 个呢?
您可以使用 linq 按其分组并获取总数:

var totals = from p in exampleList
             group p by p.Type into g
             select new { Type = g.Key, Total = g.Sum(p => p.Total ) };
Run Code Online (Sandbox Code Playgroud)

totals具有以下属性的对象的集合Type也是如此Total