有一个像下面的对象集合
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对象的所有对象的集合;
答案 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);