题
首选哪种解决方案?
对于列表:
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项。