2016-04-25 6 views
0

Bei einer Liste von Objekten einer Klasse (List<Type1>)LINQ starten und stoppen Segmente in der Liste der Liste <T> Elemente

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 

Ich mag würde die Start- und Stoppwerte in der N-Tole Gruppe erhalten (von variabler Größe) auf eine Liste von einer zweiten Klasse (List<Type2>.Add())

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

Die Reihenfolge der Elemente keine Rolle hinzuzufügen. MoreLinq als eine Option, aber nicht sicher, welche Art von Operation ich ausführen muss, um diese Werte zu erhalten. Es könnte entweder eine Partition oder eine Art GroupBy sein, aber das scheint nicht zu funktionieren.

Meine Endergebnissen ich am Ende brauchen werden

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

ich nicht bin völlig klar, was Sie zu tun versuchen. Es wäre hilfreich, wenn Sie Code schreiben könnten, der tatsächlich kompiliert würde, und vielleicht alle Versuche, die Sie bei der Lösung Ihres Problems unternommen haben. – juharr

+0

Der Arbeitscode, den ich zu dieser Sequenz bekommen muss, ist ein bisschen zu eng verbunden, um dorthin zu gelangen. Ich füge etwas hinzu, um zu zeigen, was ich stattdessen erwarte. – Manchuwook

+0

Ich würde nur durch die Liste mit einer for-Schleife durchlaufen, keine Notwendigkeit für linq. Wenn Sie ein "True" finden, speichern Sie es als Start. Führen Sie das Programm aus, bis das nächste falsch ist. Wenn ja, setze es als Stopp. – Carra

Antwort

2

Sie können eine Erweiterungsmethode verwenden, um die Gruppierung zu tun, verwenden Sie können dann:

List<Type1> runs = ... 

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

Hier ist eine mögliche Lösung für die Erweiterung Methode:

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

Hier ist ein Beispiel mit einer for-Schleife sein.

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

Wenn ich sie beide an der '// Start & Stopp hinzufügen, füge sie zu einer Liste hinzu 'zwischen' stop = item [i] 'und' start = null' hinzu, werden die Elemente nicht in der richtigen Reihenfolge sein. Gehen die regulären Nicht-Tupel-Elemente auch außerhalb der beiden "if" -Anweisungen? – Manchuwook

Verwandte Themen