【问题标题】:Split string by character count and store in string array [duplicate]按字符数拆分字符串并存储在字符串数组中[重复]
【发布时间】:2014-04-17 10:16:14
【问题描述】:

我有一个这样的字符串

abcdefghij

我想把这个字符串分成 3 个字符。 我想要的输出将是一个包含这个的字符串数组

abc
def
ghi
j

是否可以使用string.Split() 方法?

【问题讨论】:

  • 您是想在每三个位置拆分它还是要在您的示例中的 cfi 等特定字符之后拆分它?
  • string.Split(...) 至少需要一个字符,所以我不知道您如何使用它。将 String.Substring(...) 与简单循环结合使用怎么样?
  • 疯狂的方式string[] t = Regex.Matches("abcdefghij", ".{1,3}").Cast<Match>().Select(m => m.Value).ToArray();
  • @UlugbekUmirov:是的......非常疯狂

标签: c#


【解决方案1】:

此代码会将字符分组为 3 个一组,并将每个组转换为字符串。

string s = "abcdefghij";

var split = s.Select((c, index) => new {c, index})
    .GroupBy(x => x.index/3)
    .Select(group => group.Select(elem => elem.c))
    .Select(chars => new string(chars.ToArray()));

foreach (var str in split)
    Console.WriteLine(str);

打印

abc
def
ghi
j

小提琴:http://dotnetfiddle.net/1PgFu7

【讨论】:

  • 不需要.ToCharArray()
  • 对我来说似乎有点矫枉过正......只是为了使用 LINQ
  • @UlugbekUmirov 好点,已编辑。
  • @musefan 这不是为了使用 Linq,而是为了清晰易读。您将字符分组为 3 个组,然后合并字符。对我来说似乎很简单。
  • 您的代码解决了我的问题。谢谢你
【解决方案2】:

使用一点 Linq

static IEnumerable<string> Split(string str)
{
    while (str.Length > 0)
    {
        yield return new string(str.Take(3).ToArray());
        str = new string(str.Skip(3).ToArray());
    }
}

这里是Demo

【讨论】:

    【解决方案3】:
    IEnumerable<string> GetNextChars ( string str, int iterateCount )
    {
        var words = new List<string>();
    
        for ( int i = 0; i < str.Length; i += iterateCount )
            if ( str.Length - i >= iterateCount ) words.Add(str.Substring(i, iterateCount));
            else words.Add(str.Substring(i, str.Length - i));
    
        return words;
    }
    

    这将避免@Sajeetharan 回答中的ArgumentOutOfRangeException

    编辑:对不起,我之前的回答完全愚蠢:)这应该可以解决问题。

    【讨论】:

    • 甚至不编译...返回类型不匹配。出于某种原因,@Sajeetharan 删除了使这项工作正常进行的关键部分,这使他们的答案变得更加糟糕
    • 您需要做的就是将yield 添加到您之前的答案中;)
    • 遗憾的是我不知道yield 关键字的用法。我一定会调查的。谢谢。
    【解决方案4】:

    不,我认为仅使用 string.Split() 是不可能的。但是创建自己的函数很简单......

    string[] MySplit(string input)
    {
       List<string> results = new List<string>();
       int count = 0;
       string temp = "";
    
       foreach(char c in input)
       {
          temp += c;
          count++;
          if(count == 3)
          {
             result.Add(temp);
             temp = "";
             count = 0;
          }
       }
    
       if(temp != "")
          result.Add(temp);
    
       return result.ToArray();
    }
    

    【讨论】:

    • 我会使用字符串生成器或char[],而不是像这样重复连接。
    • @Rawling:也许……在我看来,这并不值得担心,但如果它适合你的喜好,那么显然没有什么坏处
    【解决方案5】:
    IEnumerable<string> Split(string str) {
        for (int i = 0; i < str.Length; i += 3)
            yield return str.Substring(i, Math.Min(str.Length - i, 3));
    }
    

    【讨论】:

    • ArgumentOutOfRangeException
    • -1 这不适用于 OP 提供的输入示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多