2012-12-20 35 views
5

我有一個類似於yesterday's question的問題。
我有這個名單<對象[] >分組列表<object[]>

List<object[]> olst = new List<object[]>(); 

olst.Add(new object[] { "AA1", "X", 1, 3.50 }); 
olst.Add(new object[] { "AA2", "Y", 2, 5.20 }); 
olst.Add(new object[] { "AA2", "Y", 1, 3.50 }); 
olst.Add(new object[] { "AA1", "X", 1, 3.20 }); 
olst.Add(new object[] { "AA1", "Y", 2, 5.30 }); 

我需要製作列表<對象[] >持有這樣的:

"AA1", "X", 2, 6.70 
"AA2", "Y", 3, 8.70 
"AA1", "Y", 2, 5.30 

換句話說,我需要組OLST由第1號第2號每個對象的元素[]和總和第3號第4號
我可以使用for循環,但我希望有人可以幫助我使用lambda表達式和/或linq來完成此操作。

+9

的' object []'保存字符串。如果你知道它們是字符串,可以使用'string []'。或者,更好的是,創建一個具有兩個有意義屬性的新類型來表示這兩個值。 – Servy

+0

@Servy - 這只是一個例子。 – Administrateur

+0

如果你知道你正在使用一對,而不是一些未知的號碼,那麼Tuple <,>或KeyValuePair <,>可能是慣用的。 –

回答

4

您需要按一個匿名類型,再總結的第三和第四列:你爲什麼要使用

List<object[]> grouped = olst 
    .GroupBy(o => new { Prop1 = o[0].ToString(), Prop2 = o[1].ToString() }) 
    .Select(o => new object[] 
    { 
     o.Key.Prop1, 
     o.Key.Prop2, 
     o.Sum(x => (int)x[2]), 
     o.Sum(x => (double)x[3]) 
    }) 
    .ToList(); 
6
List<object[]> olst = new List<object[]>(); 

      olst.Add(new object[] { "AA1", "X" }); 
      olst.Add(new object[] { "AA2", "Y" }); 
      olst.Add(new object[] { "AA2", "Y" }); 
      olst.Add(new object[] { "AA1", "X" }); 
      olst.Add(new object[] { "AA1", "Y" }); 

      var result = from ol in olst 
         group ol by new {p1 = ol[0], p2 = ol[1]} 
         into g 
         select g.First(); 

是這樣的嗎?

+1

你想要選擇'g.First()'。 – Servy

+0

是的,謝謝你的糾正。 –

0

正如評論中的建議,我會去Tuple,也許使用HashSet來代替,因爲它只會追加,如果項目不存在(也很快)。如果將項目添加到哈希集合,只要您的類型提供必要的Equals和GetHashCode方法,就不需要選擇不同的項目。
事情是這樣的:

var olst = new HashSet<Tuple<string,string>>(); 
      olst.Add(Tuple.Create("AA1", "X")); 
      olst.Add(Tuple.Create("AA1", "X")); 
      olst.Add(Tuple.Create("AA2", "Y")); 
      olst.Add(Tuple.Create("AA2", "Y")); 

如果你需要,你可以將其轉換爲上市。這裏有一個例子:

olst.ToList().ForEach(x=> Console.WriteLine(x.Item1 + " " + x.Item2)); 

會打印出

AA1 X 
AA2 Y 
+0

如果對象的類型不完全相同,並且如果沒有一致的元素數目(OP拒絕確認或拒絕這些斷言),則此解決方案將不起作用。 – Servy

+0

@Servy,是的,我知道這一點。只是可能的解決方案。不幸的是,這一點我可以從OP問題中得出。感謝您指出它。 – RAS