我有一個LINQ查詢返回一組行。其結構是:LINQ合併結果行
NAME, col1, col2, col3, col4
name1 1 null null null
name1 null 1 null null
name1 null null 1 1
因此,我想有一個包含
name1 1 1 1 1
一行所以我想組的名字這些成果和合並(?和)其他列,所以如果我有在列中的某一行中不爲null - 我將接收除null之外的任何內容。
感謝您的幫助!
我有一個LINQ查詢返回一組行。其結構是:LINQ合併結果行
NAME, col1, col2, col3, col4
name1 1 null null null
name1 null 1 null null
name1 null null 1 1
因此,我想有一個包含
name1 1 1 1 1
一行所以我想組的名字這些成果和合並(?和)其他列,所以如果我有在列中的某一行中不爲null - 我將接收除null之外的任何內容。
感謝您的幫助!
class MyObj
{
public string Name { get; set; }
public int? Col1 { get; set; }
public int? Col2 { get; set; }
public int? Col3 { get; set; }
public int? Col4 { get; set; }
}
List<MyObj> l = new List<MyObj> {
new MyObj {Name = "name1", Col1 = 1 },
new MyObj {Name = "name1", Col2 = 1 },
new MyObj {Name = "name1", Col3 = 1 },
new MyObj {Name = "name1", Col4 = 1 }
};
var qry = from o in l
group o by o.Name into g
select new
{
Name = g.Key,
Col1 = g.Any(e => e.Col1.HasValue) ? (int?)1 : null,
Col2 = g.Any(e => e.Col2.HasValue) ? (int?)1 : null,
Col3 = g.Any(e => e.Col3.HasValue) ? (int?)1 : null,
Col4 = g.Any(e => e.Col4.HasValue) ? (int?)1 : null
};
+1:Nice and簡潔相比我的! – 2009-11-25 08:50:39
public class AggregateRows
{
class AA { public string A, B, C, D;}
public void DoIt()
{
List<AA> a = new List<AA>()
{
new AA { A="1", B=null, C=null, D=null},
new AA { A=null, B="1", C=null, D=null},
new AA { A=null, B=null, C="1", D=null},
new AA { A=null, B=null, C=null, D="1"},
};
var result = a.Aggregate((a1, a2) => new AA { A = a1.A ?? a2.A, B = a1.B ?? a2.B, C = a1.C ?? a2.C, D = a1.D ?? a2.D });
Console.WriteLine("{0}{1}{2}{3}",result.A,result.B,result.C,result.D);
}
}
產生
1111
和
public class AggregateRows
{
class AA
{
public string N, A, B, C, D;
}
public void DoIt()
{
List<AA> data = new List<AA>()
{
new AA { N="Name", A="1", B=null, C=null, D=null},
new AA { N="Name", A=null, B="2", C=null, D=null},
new AA { N="Name", A=null, B=null, C="3", D=null},
new AA { N="Name", A=null, B=null, C=null, D="4"},
new AA { N="Name2", A="2", B=null, C=null, D=null},
new AA { N="Name2", A=null, B="2", C=null, D=null},
new AA { N="Name2", A=null, B=null, C="2", D=null},
new AA { N="Name2", A=null, B=null, C=null, D="2"},
};
var results = data.GroupBy(a => a.N)
.Select(k =>
{
var values = k.Aggregate((a1, a2) => new AA
{
A = a1.A ?? a2.A,
B = a1.B ?? a2.B,
C = a1.C ?? a2.C,
D = a1.D ?? a2.D
});
return new AA { N = k.Key, A = values.A, B = values.B, C = values.C, D = values.D };
});
foreach (var result in results)
Console.WriteLine("{0} {1}{2}{3}{4}", result.N, result.A, result.B, result.C, result.D);
}
}
產生
Name 1234
Name2 2222
編輯:在回答你的澄清......
我想你可以從這裏拿走它。如果你想要做的只是找出組內是否有列,那麼像Bruno的答案那樣的運營商就是要走的路。 Aggregate
只有在您嘗試實際訪問所有值才能完成像複合它們那樣更復雜的事情時(儘管Jon提到Sum
處理該特定情況),它纔是必需的。
總之,你要的是分組就像在兩個答案,然後在集團內部,你要麼使用Aggregate
通過排或多Any
在GroupBy
的結果合併行,這取決於在你的背景下更清晰(或更有效,如果你在每個組中有大量的數據)
確定你的意思是 Console.WriteLine(「{0} {1} {2} {3} {4}」,result.N,result.A,result.B,result.C,result.D); – 2009-11-25 08:44:07
@ melco-man:是的,謝謝 - 改變了它(其他地方我的代碼實際上是正確的,但是並行地編輯了這些改變,並且編輯器在長篇帖子中肯定無助於此) – 2009-11-25 08:52:57
你*實際*要求總結或沒有?如果其中一個空值實際上是2,結果會是什麼? – 2009-11-24 14:08:31
你需要提供更好的示例數據,以顯示你想如何組合東西等 – 2009-11-24 14:21:58
正如我在最後一句中提到的「除null外的任何東西」我需要某種布爾真或假。在我的情況下,null將是錯誤的,其他任何事情都是正確的。 – 2009-11-25 07:42:22