2016-04-25 3 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

Вот пример с одной для цикла.

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', элементы будут выведены из строя. Кроме того, регулярные элементы, не относящиеся к тупочке, выходят за пределы двух операторов 'if'? – Manchuwook

 Смежные вопросы

  • Нет связанных вопросов^_^