2011-11-03 55 views
1

我有一個數組List<SomeObject>其中包含升序的日期(和一些更多的信息領域)。該列表將分組到List<List<SomeObject>>,這與我的主題相關。拆分列表<SomeObject>到幾個子列表

一個List<SomeObject>組合成List<List<SomeObject>>。在這前一種情況下只包含1行。

某些計算髮生在該行的LastOrDefault和FirstOrDefault上。 (最後,該方法返回一個具有日期,類型和計算值的SomeObject)

List<List<SomeObject>> Array; // Should be filled with the grouped List<SomeObject> 

List<SomeObject>    // One SomeObject is a row below, 
2011-01-01 enumType.Ok  140.0 
2011-01-02 enumType.Ok  210.0 
2011-01-03 enumType.Ok  250.0 
2011-01-04 enumType.Blocking 310.0 
2011-01-05 enumType.Ok  4.0 
2011-01-06 enumType.Ok  34.0 
2011-01-07 enumType.Ok  93.0 
and counting.. 

數組中的每一行都有一個類型(枚舉),通常是「好」。
此數組可能有「NotOk」而不是「Ok」(簡化說明)。

所以,問題是,
行2011-01-05有NotOk,必須拆分陣列。結果如下。所有行到封閉在一個陣列中,則對於行的其餘部分下一個陣列(或「阻塞」的下一個點。

List<SomeObject> 
2011-01-01 enumType.Ok  140.0 
2011-01-02 enumType.Ok  210.0 
2011-01-03 enumType.Ok  250.0 
2011-01-04 enumType.Blocking 310.0 

List<SomeObject> 
2011-01-05 enumType.Ok  4.0 
2011-01-06 enumType.Ok  34.0 
2011-01-07 enumType.Ok  93.0 
and counting.. 

然後,我可以單獨做GROUPBY /每個列表上計算總和並最後總結每個GROUPBY在一起。

[編輯]
筆者從BrokenGlass答案,這工作完全一樣說明。雖然幫助,我在我的問題一個錯字是改變他的答案的行爲。此下一個陣列中的第一項應該是AFTER .Blocking。在if(currentList.Count - 條款之前,只需要他的currentList.Add(item);,答案是仍然正確。請注意,只有在需要時才應該進行此擴展,因爲每次由於「阻止」而需要循環每個值時,我都會錯過Q的要點。

+0

你有一個列表''或'名單<名單>'?你的代碼顯示後者,但你的描述表明前者。 –

+0

每行都有枚舉類型?你能證明它在哪裏嗎?我看到一個SomeObject列表的列表。 – Nayan

+0

澄清問題! – Independent

回答

2

你可以只寫一個簡單的擴展方法你一個列表分成列出的枚舉,每個都包含在任何至少一個項目和分

public static class MyExtensions 
{ 
    public static IEnumerable<List<SomeClass>> Split(this IEnumerable<SomeClass> source) 
    { 
     List<SomeClass> currentList = new List<SomeClass>(); 
     foreach (var item in source) 
     { 
      if(currentList.Count > 0 && item.State == States.NotOk) 
      { 
       yield return currentList; 
       currentList = new List<SomeClass>(); 
      } 
      currentList.Add(item); 
     } 

     if (currentList.Count > 0) 
      yield return currentList; 
    } 
} 
+0

謝謝,這就是訣竅!雖然,我看到我應該首先檢查是否存在任何塊。如果有null/0,請避免運行拆分。 – Independent

2

首先我會根據枚舉類型「OK」,「NOT OK」對列表進行分組。

然後以此爲基礎進行類型

下面的功能已經發布我用了它的選擇。

list.GroupBy(item => item.SomeProperty).Select(group => new List<T>(group)) 

看看這個post其他的解決方案

+0

糾正我,如果我錯了。這不會將「屬性X」和「屬性y」放在不同的數組中, – Independent

+0

在SomeProperty中值不同的項目在不同的情況下,因爲您可以聲明新列表並添加.ToList();在表達式的末尾 – SShebly

+0

謝謝,但我仍然認爲你理解我錯了。在單元測試中嘗試上面BrokenGlass的解決方案,並查看輸出的不同。這讓我無需兩三個小時。 – Independent

0

我有一個很難跟隨你的問題,但如果你只是想分割的大名單爲基礎上,SomeObject一個等兩項子列表,然後你CA:與國家NotOk項目ñ做到以下幾點:

List<SomeObject> list1 = mainList.Where(t => t.NotOk); 
List<SomeObject> list2 = mainList.Where(t => !t.NotOk); 
+0

對不起。盡力做到最好。不是你的樣品只是把「屬性X」和「屬性Y」放在不同的數組中, – Independent

1
var lstItems = new List<SomeType> { /*Your items in here*/ } 

var indexCollection = from item in lstItems 
         where item.EnumIsOkVar == EnumIsOk.NotOk 
         select lstItems.IndexOf(item); 

var lstLst = new List<List<SomeType>>(); 

foreach (var singleIndex in indexCollection) { 
    var lstFound = (from item in lst 
        where lstItems.IndexOf(item) >= singleIndex 
        where lstItems.IndexOf(item) < singleIndex + 1 
        select item).ToList(); 
    lstLst.Add(lstFound); 
}