2014-02-17 85 views
0

與條件獲取有一個對象集合像下面集團和與Linq中

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組對象和金額的「值」屬性 並獲得唯一的那些對象總和大於零。 在上面的例子中,我需要包含所有對象,除了/不包括坦克3對象,其值的總和爲0;

回答

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

編輯

尚不清楚,如果你想,作爲結果,與和一個新的對象,如果和是隻是一種方法排除一些對象...

0
list.GroupBy(x => x.UtilityName) 
    .Where(x => x.Sum(y => y.Value) > 0) 
    .SelectMany(g => g); 
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)};