【问题标题】:C# String array modifcation without recursion没有递归的C#字符串数组修改
【发布时间】:2019-06-12 00:02:58
【问题描述】:

我有一个带有值的字符串数组

patrick 
portland 
vic 

我想实现以下目标:

对于第一遍,我希望在每个条目的末尾附加一个带有 * 的数组:

patrick*
portland*
vic*

第二遍,我想用 ~ 代替 *:

patrick*
portland*
vic~

patrick*
portland~
vic*

patrick~
portland*
vic*

对于第三遍,我想用 ~ 替换另一个 *:

patrick~
portland*
vic~

patrick~
portland~
vic*

patrick*
portland~
vic~

以此类推,直到所有 * 都被 ~ 替换。

有没有办法不用递归?

编辑 1:

需要根据以下字符串生成:patrick portland vic

patrick*portland*vic*
patrick*portland*vic~
patrick*portland~vic*
patrick~portland*vic*
patrick~portland*vic~
patrick~portland~vic*
patrick*portland~vic~
patrick~portland~vic~

我认为将字符串拆分为数组然后继续工作会更容易。

编辑 2:

设法使用笛卡尔积解决了这个问题。

    string[] stnameSplit = streetName.Split(' ');

    string[] chars = { "*", "~" };
    var cartesianProduct = from name in stnameSplit
                           from cha in chars
                           select new { name, cha };

    List<string> vals = cartesianProduct.Select(p => p.name + p.cha).ToList();

        List<List<string>> embeddedList = new List<List<string>>();

        int ctr = 0;

        List<string> l = new List<string>();

        foreach (string s in vals)
        {
            l.Add(s);

            if (ctr % 2 == 1)
            {
                embeddedList.Add(l);

                l = new List<string>();
            }

            ctr++;
        }

        var result = embeddedList.ToArray().CartesianProduct();

最后一行调用 Eric Lippert 所描述的 CartesianProduct 方法。

感谢大家的帮助和指引我正确的方向。

【问题讨论】:

  • 我不明白为什么你需要多次传递,或者传递 2 和 3 是如何工作的,这至少可以说是令人困惑的
  • 总有一种方法可以不用递归;递归只是编写循环的一种奇特方式。您有更具体的问题吗?
  • 你能告诉我们一个递归算法来解决你的问题吗?如果你的问题是“我有一个递归算法,我需要让它迭代,我该怎么做?”,我们当然可以给你一些策略。但这个问题需要说得更清楚。
  • 另外,如果您能说出为什么要避免递归解决方案,那将有所帮助。通常对于这类问题,递归解决方案简短、易于理解且优雅,而迭代解决方案则是一团糟。为什么要避免使用简短、优雅、易于理解的解决方案?
  • 好的,我已投票重新提出问题

标签: c# arrays string


【解决方案1】:

鉴于您在问题中发布的解决方案,我认为它似乎有点冗长。我想我会尝试缩短。

这里是:

string streetName = "patrick portland vic";

string[] split = streetName.Split(' ');
string[] chars = { "*", "~" };

IEnumerable<IEnumerable<string>> choices = split.Select(n => chars.Select(c => $"{n}{c}"));

IEnumerable<IEnumerable<string>> result = choices.CartesianProduct();

【讨论】:

  • 谢谢,您的解决方案更优雅。
猜你喜欢
  • 2017-04-06
  • 2013-05-11
  • 2020-05-04
  • 1970-01-01
  • 2017-10-28
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多