在Linq中对条件进行分组和求和

时间:2014-02-17 17:24:49

标签: linq c#-4.0

有一个像下面的对象集合

UtilityName ="tank1";
Period ="A";
Value=170

UtilityName ="tank1";
Period ="B";
Value=120


UtilityName ="tank2";
Period ="A";
Value=220


UtilityName ="tank2";
Period ="B";
Value=260

UtilityName ="tank3";
Period ="A";
Value=0

UtilityName ="tank3";
Period ="B";
Value=0

UtilityName ="tank4";
Period ="A";
Value=10

UtilityName ="tank4";
Period ="B";
Value=0

需要一个Linq查询,我可以在其中按UtilityName对对象进行分组,并按“Value”属性进行求和  并且只获得总和大于零的那些对象。 在上面的例子中,我需要包含除了/不包括其总和为0的Tank 3对象的所有对象的集合;

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

var qry = from obj in list
          group obj by obj.UtilityName into g
          where g.Sum(x => x.Value) > 0
          select new { UtilityName = g.Key, Value = g.Sum(x => x.Value)};

答案 1 :(得分:0)

这样的事情:

var result = objects
    .GroupBy(
        o => o.UtilityName,
        o => o,
        (name, grouping) => new
                            {
                                Sum = grouping.Sum(o => o.Value),
                                Items = grouping
                            })
    .Where(a => a.Sum > 0)
    .SelectMany(a => a.Items);

答案 2 :(得分:0)

您可以先删除零值(如果具有相同UtilityName的所有元素都具有0值,则它们将不会出现在组中)。

如果您没有负值,这将是最简单的方法。

但是,如果您需要计数,例如,这将不再有效。

var result = list.Where(m => m.Value > 0)
                 .GroupBy(m => m.UtilityName)
                 .Select(m => new {
                   UtilityName = m.Key,
                   SumValues = m.Sum(x => x.Value)
                 });

不那么“脆弱”:

   var result = list
                   .GroupBy(m => m.UtilityName)
                   .Select(m => new {
                      UtilityName = m.Key,
                      SumValue = m.Sum(x => x.Value)
                   })
                   .Where(m => m.SumValue > 0);

修改

不清楚你是否想要一个带有和的新对象,或者总和只是一种排除某些对象的方法......

答案 3 :(得分:0)

list.GroupBy(x => x.UtilityName)
    .Where(x => x.Sum(y => y.Value) > 0)
    .SelectMany(g => g);