Объединение двух списков и замена элементов - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я работаю над приложением .NET 4.7.2.Мне нужно объединить 2 списка в 1 и заменить определенные элементы.Мне интересно, каков наилучший подход для достижения этой цели.

Проблема в следующем: у меня есть определенный список фруктов:

Fruits
------
Apple 
Banana 
Orange
Lemon

Мне нужноиспользовать Фрукты сверху в моем списке результатов, который создается с использованием 2 списков внизу.Списки Template и Selection содержат только строковые значения.A, B ... будет точно в том же порядке в Выбор и Шаблон.В шаблоне у меня просто есть несколько фруктовых заполнителей, добавленных в Selection.

Мои 2 списка выглядят так:

 Template | Selection
---------------------
  A       |   A
  Fruit   |   Orange
  D       |   D
  Fruit   |   Lemon
  C       |   C
  Fruit   |   B
  B       |   

Цель состоит в том, чтобы создать список результатов, основанный на шаблоне.Мне нужно заменить фруктовый заполнитель фруктом из Selection.Если в выборе нет фруктов, например между C и D, мне нужно взять первый доступный фрукт из моего списка фруктов.


Когда я создаю результат, я отрезаю апельсин и лимон отФрукты - и я просто выбираю первый доступный фрукт из списка Фрукты, чтобы заменить заполнитель Фрукты в списке шаблонов, например, сначала я нарезаю Апельсин и Лимон из Фруктов, затем я выбираю Apple, потому что он все еще доступен.


Результат выглядит примерно так:

Result
------
  A
  Orange
  D
  Lemon
  C
  Apple
  B

Объединить эти списки довольно сложно.

Мой класс FruitGarden выглядит так:

    public class FruitGarden
    {
       public List<string> Fruits { get; set; } // Apple, Banana, Orange, Lemon

       public List<string> PrepareFruits(List<string> Template, List<string> Selection)
       {
          var result = new List<string>();
          var cntSelection = 0;

          for (var cntTemplate = 0; cntTemplate < Template.Count; cntTemplate++){
            // here I need to replace the Fruit in my Template list with an available Fruit from Temporary or from Fruits
              do
              {
              }(cntSelection< Temporary.Count)

            }

          return result;
       }
    }

Что бы вы предложили, в C #, как было бы хорошим способом объединить 2 списка в 1?

1 Ответ

0 голосов
/ 27 ноября 2018

Предполагая, что случайные строки не могут быть Fruit и что исчерпание Selection s означает использование первого левого Fruits, это моя попытка:

public List<string> PrepareFruits(List<string> Template, List<string> Selection) {
    var result = new List<string>();

    var cntSelection = Selection.Count;
    var cntTemplate = Template.Count;
    var workFruits = new LinkedList<string>(Fruits);
    var idxSelection = 0;
    for (var idxTemplate = 0; idxTemplate < cntTemplate; ++idxTemplate) {
        if (Template[idxTemplate] == "Fruit") {
            if (idxTemplate+1 == cntTemplate || (idxSelection < cntSelection && Selection[idxSelection] != Template[idxTemplate + 1])) { // must be a Fruit selection
                result.Add(Selection[idxSelection]);
                workFruits.Remove(Selection[idxSelection]);
                ++idxSelection;
            }
            else {
                result.Add(workFruits.First());
                workFruits.RemoveFirst();
            }
        }
        else {
            result.Add(Template[idxTemplate]);
            ++idxSelection;
        }
    }

    return result;
}

Я решил использоватьLinkedList было бы лучше, чем копировать оставшуюся часть workFruits каждый раз, когда Selection пропускал фрукт, но что лучше, вероятно, зависит от числа Fruits и частоты, с которой в Selection отсутствуют элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...