首选哪种解决方案?

对于列表:

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; }
}

我希望根据“总计”值得到小计。

选项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);

选项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;

    }
}

在大多数情况下,列表将是<!> lt; 10项。

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

有帮助吗?

解决方案

这两个示例都有重复的代码,并且两者都没有为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 ) };

所以totals是具有属性Total和<=>

的对象的集合

其他提示

无论列表大小如何,如果您的目标是.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) };

(不完全确定代码是否正常工作,它只是从 101 LINQ示例。但语法应该没问题。)

选项3

var groupings = exampleList
    .GroupBy(x => x.Type, x => x.Total)
    .Select(x => new { Type = x.Key, SubTotal = x.Sum() } );

你会有一个类似的列表:

class <Anonymous>
{
    public string Type { get; }    
    public decimal SubTotal { get; }  
}

枚举并指定适当的值,尽管对于这么小的一组可能有点过分。

我不认为这些小名单会有太大的性能差异。

选项1将遍历列表两次,而选项2仅迭代列表一次。对于较大的列表而言,这可能比较小的列表更重要。

选项1更具可读性,但我肯定会发表评论,它会在列表中迭代两次。

选项2的明显优势在于代码适用于.NET Framework 2.0。使用LINQ意味着您的应用程序需要.NET Framework 3.5。

对于option1,在内部,foreach循环将由C#运行时env执行两次。因此处理类型会更多。但对于<!> lt; 10项,它几乎没有任何区别,选项1似乎更具可读性。我会选择<!> lt; 10项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top