合并两个列表并替换元素

时间:2018-11-26 20:45:30

标签: c# .net list sorting merge

我目前正在开发.NET 4.7.2应用程序。我需要将2个列表合并为1个并替换某些元素。我想知道实现此目标的最佳方法是什么。

问题如下:我有给定的水果列表:

Fruits
------
Apple 
Banana 
Orange
Lemon

我需要在结果列表中使用上方的水果,该结果使用下面的2个列表创建。列表模板和选择仅包含字符串值。 A,B ...在“选择”和“模板”中将以相同的顺序完全相同。在模板中,我只是将一些水果占位符添加到选择中。

我的2个列表如下:

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

目标是创建一个基于模板的结果列表。我需要用Selection中的水果替换Fruit占位符。如果没有选择的水果,例如C和D之间,则需要从“水果”列表中取出第一个可用的水果。


创建结果时,我从“水果”中切出“橙色”和“柠檬”-我只是从“水果”列表中选择了第一个可用的水果,以替换模板列表中的“水果”占位符,例如首先,我从水果中切出橘子和柠檬,然后选择苹果,因为它仍然可用。


结果看起来像这样:

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 :(得分:1)

假设随机字符串不能为Boolean,并且用尽def require(func: PartialFunction[T, Boolean]):Boolean = { val left = eventsToBeProcessed.dropWhile(!func.isDefinedAt(_)) left.headOption.forall(head => { eventsToBeProcessed = left.tail func(head) }) } 意味着要使用左第一行Fruit,这是我的尝试:

Selection

我认为使用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更好,但这取决于{{1}的数量}以及workFruits缺少元素的频率。