在拆分字符串中查找所有组

本文关键字:查找 拆分 字符串 | 更新日期: 2023-09-27 18:21:50

注意标题并不能准确反映我需要做什么,但我找不到正确的单词,因为我的英语并不完美。如果有人想纠正,请放心。


给定一个包含组(由n个点分隔)的字符串,我想获得所有值:group[0];group[0]。group[1];组[0]。组[1]..组[n].

示例:输入:Tr.WH.Eu6.ISC将给出:

  • Tr
  • Tr.WH
  • Tr.WH.Eu6
  • Tr.WH.Eu6.ISC

现在我有这个代码:

string input = "Tr.WH.Eu6.ISC";
string[] splitStrings = input.Split('.');
List<string> subs = new List<string> { "" };
for (int i = 0; i < splitStrings.Count(); i++)
{
    subs.Add(subs.Last() + "." + splitStrings[i]);
}
subs.Remove("");

我发现它很难看,而且在输出时不能完全工作:

  • .Tr
  • .Tr.WH
  • .Tr.W.H.Eu6
  • .Tr.W.H.Eu6.ISC

我如何使它工作(最好是与Linq一起)?

在拆分字符串中查找所有组

使用LINQ:

string input = "Tr.WH.Eu6.ISC";
string[] groups = input.Split('.');
string[] output = groups.Select((x, idx) => string.Join(".", groups.Take(idx + 1)))
                        .ToArray();

对于每个组,其中idx是组的索引,从groups集合中获取(idx+1)个条目,并使用"."分隔符将它们连接起来。

我不知道如何在Linq中完全做到这一点,但您可以使用String.Join.Take来清理代码(这来自Linq)。

string input = "Tr.WH.Eu6.ISC";
string[] splitStrings = input.Split('.');
List<string> subs = new List<string>();
for (int i = 1; i <= splitStrings.Count(); i++)
{
    subs.Add(String.Join(".", splitStrings.Take(i).ToArray()));
}

试试这个:

var v = str.Split('.');
            for(int i=0;i<v.Count();i++)
        {
            Console.WriteLine(string.Join(".", v.Take(i+1)));
        }

我们仍然使用Split方法,然后在循环中使用JoinTake来显示每次增加的分段数量。

演示

另一种方式:

var v = str.Split('.');
Enumerable.Range(1,v.Count()).ToList().ForEach(x => Console.WriteLine(string.Join(".", v.Take(x))));

演示

没有LINQ。将字符串拆分为数组,然后进行连接——这不是按内存进行高效编码的方法。

static IEnumerable<string> SplitIntoGroups(string s, char delimiter)
{
    for (int findPos = 0, delimPos = 0; 
            (delimPos = s.IndexOf(delimiter, findPos)) != -1; 
            findPos = delimPos + 1)
    {
        yield return s.Substring(0, delimPos);
    }
    yield return s;
}