【问题标题】:Substring build in iteration loop based on delimiters基于分隔符的迭代循环中的子字符串构建
【发布时间】:2015-12-05 16:43:07
【问题描述】:

我是C# 的新手,遇到了麻烦。

我有这个带有'/'-分隔符的字符串:"1/2/10/4"

我在循环中迭代时需要使用的字符串应该如下所示:

i = 1; "1"
i = 2; "1/2"
i = 3; "1/2/10"
i = 4; "1/2/10/4"  

这里应该以某种方式集成,但我不知道如何:

        var IDArray = Convert.ToString(NodesID).Split('/');
        for (int i = 0; i < Convert.ToString(NodesID).Count(x => x == '/')+2; i++)
        {
            string IDCheck = IDArray[i];
            string ???
        }

【问题讨论】:

  • 欢迎来到 Stack Overflow!我对您的问题进行了一些编辑并添加了 C# 标签。一般来说,您应该几乎总是添加您正在使用的语言的标签。标签可帮助合适的人看到您的问题,以便更快地得到解答。

标签: c# delimiter


【解决方案1】:

我建议使用一个辅助方法,它会产生您正在寻找的所有子路径。像这样的东西应该可以工作:

public IEnumerable<string> GetSubPaths(string s)
{
    var sb = new StringBuilder();
    for(int i = 0; i < s.Length; s++)
    {
        if(s[i] == '\\')
            yield return sb.ToString();
        sb.Append(s[i]);
    }
    yield return sb.ToString();
}

此方法使用了一个名为yield return 的C# 技巧,它会返回一个IEnumerable&lt;&gt;,其中每个元素都基于提供给yield return 的内容。因此,返回的 IEnumerable&lt;&gt; 中的元素将代表您所描述的每个子字符串组。

然后您可以随意使用此方法的结果:

var subPaths = GetSubPaths("1/2/10/4").ToList();
for(int i = 0; i < subPaths.Count; i++)
{
    Console.Write("i = " + i + "; ");
    Console.WriteLine(subPaths[i]);
}

【讨论】:

  • 我尝试了您的代码,并且该字符串通过迭代正确构建。伟大的!但是没有返回正确值的是 IDCheck = IDArray[i];我从同一个循环中的定界符 Input-String 中检索“for(int i = 0; i
  • 我解决了分配错误的字符串的问题。但最后我遇到了计算错误的数组维度问题。因此循环没有正确迭代......我尝试了“displayName”提出的代码并且它立即工作。还是谢谢
【解决方案2】:

不完全是最易读的代码,但一个 linqy 解决方案是:

var list = YourInput.Split('/').Aggregate(new List<string>(), (l, el) => { l.Add(l.Count == 0 ? el : l[l.Count - 1] + "/" + el); return l; });

这将创建一个包含字符串的列表。

【讨论】:

  • PS,虽然是一个有效的工作解决方案,但这个答案更多地是为了展示 linq 的可能性,而不是创建一些容易看到的东西。 StriplingWarrior 的代码在这方面要好得多;)如果使用聚合,理论上你甚至可以直接将它与以前的和当前的(无列表)一起使用,并在聚合操作中做你的事情,但为了可维护性,这将是一个相当糟糕的方法。
【解决方案3】:
var IDArray = Convert.ToString(NodesID).Split('/');
var builder = new StringBuilder();
for (int i = 0; i < IDArray.Length; i++)
{
    builder.Append(IDArray[i]);
    var stringToUse = builder.ToString();

    //...
    //Use the stringToUse here. It contains exactly what you want.
    //...

    builder.Append("/");
}

一切都是不言自明的。如果您有什么不明白的地方(或者我未能正确解释您的问题),请告诉我。

【讨论】:

  • 为什么不更新你的答案呢?就目前而言,代码甚至无法编译。
猜你喜欢
  • 2012-01-23
  • 2013-09-13
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2019-05-08
相关资源
最近更新 更多