2016-10-13 9 views
0

Я работаю над музыкальным приложением, которое читает лилий и midi-файлы. Оба типа файлов необходимо преобразовать в наше собственное хранилище.C# Объединить список массивов с разницей разницы

Для lilypond вам необходимо прочитать повторы и их альтернативы. Однако может быть разница в подсчете. Если есть три повтора, но две альтернативы, первые два повторения получают первую альтернативу, а третий вариант получает последнюю альтернативу.

Из-за повторного использования, начиная с фронта, я не знаю, как это сделать. Мой текущий код выглядит так, поэтому единственная часть отсутствует - это комбинирование repeatList и altList.

Я надеялся, что для этого есть математическое решение, потому что переворачивание массивов будет трагичным для выполнения.

private List<Note> readRepeat(List<string> repeat, List<string> alt, int repeatCount) 
    { 
     List<Note> noteList  = new List<Note>(); 
     List<Note> repeatList = new List<Note>(); 
     List<List<Note>> altList  = new List<List<Note>>(); 

     foreach (string line in repeat) 
     { 
      repeatList.AddRange(readNoteLine(line)); 
     } 

     foreach (string line in alt) 
     { 
      altList.Add(readNoteLine(line)); 
     } 

     while (repeatCount > 0) 
     { 
      List<Note> toAdd = repeatList.ToList(); // Clone the list, to destroy the reference 

      if (altList.Count() != 0) 
      { 
       // logic to add the right alt 
      } 

      noteList.AddRange(toAdd); 

      repeatCount--; 
     } 

     return noteList; 
    } 

В приведенном выше коде два списка заполняются примечаниями. Их функция следующая: RepeatList: Основной список заметок, которые воспроизводятся x раз AltList: список возможностей, которые нужно добавить в список повторов.

Некоторые примеры ввода/вывода

  • RepeatCount = 4
  • AltList.Count() = 3

  • Повторить 1 получает: Вариант 1
  • Повторите 2 получает: Alt 1
  • Repeat 3 получает : Alt 2
  • Повторить 4 получает: Alt 3

Пример в визуальном стиле

Input Output

+1

что вы на самом деле здесь делаете? вы добавляете элементы в 2 списка, которые находятся только в области функции и возвращают третий список, который никогда не заполняется данными. –

+1

Не могли бы вы предоставить некоторые образцы данных и ожидаемый результат? –

+1

@GiladGreen Я думаю, он хочет, чтобы мы заполнили пробелы. Но я не понимаю этого требования. Пример ввода/вывода будет необходим. –

ответ

0

Из того, что я понимаю, вот некоторые из возможных способов реализации логической части (в основном вам просто нужно поддерживать курсор на соответствующей альтернативе). Это вместо вашей петли while.

int currentAlt = 0; 
for (int currentRepeat = 0; currentRepeat < repeatCount; currentRepeat++) 
{ 
    noteList.AddRange(repeatList); 
    noteList.AddRange(altList[currentAlt]); 
    if (currentRepeat >= repeatCount - altList.Count) 
    { 
    currentAlt++; 
    } 
} 

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

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