2016-04-25 34 views
0

給定一個類(List<Type1>LINQ啓動並在清單列表停止段<T>元素

item1.isbool = true, beat = 1 
item2.isbool = true, beat = 1.333 
item3.isbool = true, beat = 1.666 
item4.isbool = false, beat = 2 
item5.isbool = false, beat = 3 
item6.isbool = false, beat = 4 
item7.isbool = false, beat = 5 
item8.isbool = true, beat = 5.333 
item9.isbool = true, beat = 5.666 

的對象的列表,我想獲得的連音組中的啓動和停止值(可變大小的)添加到第二類(List<Type2>.Add()

item1.tuplet = start 
item3.tuplet = stop 
item8.tuplet = start 
item9.tuplet = stop 

元素的順序非常重要的列表。 MoreLinq作爲一個選項,但不是我需要執行的那些類型的操作來獲取這些值。它可以是分區或某種GroupBy,但似乎不起作用。

我的最終結果,我需要在年底將要

List2.Add(new Object() {Tuplet = TupletType.Start}); 
List2.Add(new Object() {Tuplet = TupletType.None}); 
List2.Add(new Object() {Tuplet = TupletType.Stop}); 
List2.Add(new Object() {Tuplet = TupletType.None}); 
List2.Add(new Object() {Tuplet = TupletType.None}); 
List2.Add(new Object() {Tuplet = TupletType.None}); 
List2.Add(new Object() {Tuplet = TupletType.None}); 
List2.Add(new Object() {Tuplet = TupletType.Start}); 
List2.Add(new Object() {Tuplet = TupletType.Stop}); 
+2

我不是完全清楚你正在嘗試做什麼。如果您可以發佈實際編譯的代碼,並嘗試解決您的問題,那將會很有幫助。 – juharr

+0

我必須得到這個序列的工作代碼有點太相互關聯了。我會添加一些來顯示我期待的內容。 – Manchuwook

+0

我只是用for循環遍歷列表,不需要linq。如果您發現「真實」,請將其保存爲開始。跑到下一個是假的。如果是,請將其設置爲停止。 – Carra

回答

2

您可以使用擴展方法做分組,那麼你可以使用:

List<Type1> runs = ... 

List<Type2> grouped = new List<Type2>(); 
grouped.AddRange(runs.GroupByRuns()); 

下面是擴展方法可能的解決方案:

public static class GroupType 
{ 
    public static IEnumerable<Type2> GroupByRuns(this IEnumerable<Type1> sequence) 
    { 
     if (sequence.Count() == 0) 
      yield break; 

     List<bool> next_items = sequence.Select(s => s.isbool).ToList(); 
     next_items.Add(false); 

     bool previous_item = false; 
     int idx = 1; 
     foreach (var item in sequence) 
     { 
      if (item.isbool) 
      { 
       if (previous_item == false) 
       { 
        yield return new Type2 { Tuple = Type2.TupletType.Start }; 
       } 
       else if (next_items.ElementAt(idx) == true) 
       { 
        yield return new Type2 { Tuple = Type2.TupletType.None }; 
       } 
       else 
       { 
        yield return new Type2 { Tuple = Type2.TupletType.Stop }; 
       } 
      } 
      else 
      { 
       yield return new Type2 { Tuple = Type2.TupletType.None }; 
      } 
      previous_item = item.isbool; 
      idx++; 
     } 
    } 
} 
0

下面是一個for循環的例子。

Type1 start; 
Type1 stop; 

for (int i=0; i<list.Length; i++) 
{ 
    if(start == null && list[i].isbool) 
    start = item[i]; 
    if(start != null && (i+1 == list.Length) || !list[i+1].isbool) 
    //no next item or next item is false? Found the stop. 
    { 
    stop = item[i];//Found a start & stop, add them to a list 
    start = null; 
    } 
} 
+0

如果我將它們加在'//找到一個開始和停止,將它們添加到'stop = item [i]'和'start = null'之間的列表中,則這些項目將會出現故障。另外,常規的非tuplet項目是否超出了兩個if語句的範圍? – Manchuwook