【问题标题】:Merging two lists and replace elements合并两个列表并替换元素
【发布时间】:2019-04-28 13:12:51
【问题描述】:

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

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

Fruits
------
Apple 
Banana 
Orange
Lemon

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

我的 2 个列表如下所示:

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

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


当我创建结果时,我从 Fruits 中剪切了 Orange 和 Lemon - 我只是从 Fruits 列表中选择第一个可用的水果来替换模板列表中的 Fruit 占位符,例如首先我从水果中切下橙子和柠檬,然后我选择苹果,因为它仍然可用。


结果如下所示:

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 个的好方法是什么?

【问题讨论】:

  • 原始列表中的“Apple”和“Banana”发生了什么?你从哪里得到 A-D?
  • 我对你所追求的逻辑感到非常困惑。你说你需要将两个列表合并在一起,其中一个是第一个“水果”列表,但另一个是计算出来的,somewhere。你能提供这个方法的确切输入和输出吗?
  • 显示一些代码。 temporary 列表中的空项如何表示?它们是否保证长度相同?你看过 LINQ Zip 吗?到目前为止,您尝试过什么?
  • 你读过How to Ask吗?
  • 模板和选择中的随机字符串是否总是相同的?

标签: c# .net list sorting merge


【解决方案1】:

假设随机字符串不能是Fruit 并且用完Selections 意味着使用第一个左边的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 会比每次Selection 跳过一个水果时都复制workFruits 的其余部分要好,但哪个更好可能取决于Fruits 的数量和@987654329 的频率@ 缺少元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2021-11-05
    • 1970-01-01
    • 2014-01-06
    • 2021-11-09
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多