【问题标题】:How can I start a splitted string from index 1 instead of 0?如何从索引 1 而不是 0 开始拆分字符串?
【发布时间】:2021-05-27 07:43:22
【问题描述】:

我有以下代码,它从控制台读取一行:

// Read text from input
var inputText = Console.ReadLine();
var inputTextSplit = inputText.Split(' ');

可能的输入可能是:您好,我的名字是约翰。如果我现在尝试迭代此输入,“Hello”将是第一个索引 (0)。所以 inputTextSplit[0] 将等于 Hello,inputTextSplit[1] 将等于“my”等。我想要实现的是一种使索引计数从 1 开始的方法。所以我想要 inputTextSplit[0 ] 没有值(或任何填充值),inputTextSplit[1] 为“Hello”,inputTextSplit[2] 为“my”,等等。

【问题讨论】:

  • 奇数要求。但可以像 ("ignore " + inputText).Split(' ')
  • 非常奇怪的要求。你能解释一下为什么你需要让第一个索引为空吗?这看起来很像XY Problem
  • 数组从零开始,因为它更快。获取数组开头的内存地址,添加索引,这就是存储对象的位置。第一项存储在与数组开头相同的位置,因此偏移量为零。
  • 为什么要从 1 开始索引?

标签: c# .net algorithm


【解决方案1】:

你不能 - split 总是将第一段放入数组的第一个元素中,该元素的索引确实为 0。

如果您确实需要第一个段位于索引 1,您可以:

  • 改变起始字符串总是有额外的价值

     var inputTextSplit = ("skip " + inputText).Split(' ');
    
  • 如果您只需要一个第一个元素无关紧要的可枚举 - 与空数组连接:

     var startingAtOne = (new[]{"skip"}).Concat(inputTextSplit);
    
  • 将数组复制到一个新数组,并在开头添加一个额外元素 - Insert a element in String array

     var startingAtOne = (new[]{"skip"}).Concat(inputTextSplit).ToArray();
    

请注意,这是一个非常奇怪的要求,可能应该在使用结果的代码中解决。

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点,这里有一些

    给定

    var inputText = Console.ReadLine();
    

    只需在开头添加一个额外的空格

    var inputTextSplit = (" " + inputText).Split(' ')
    

    转换为List 并使用Insert,然后转换回Array

    var inputTextSplit = inputText.Split(' ').ToList();
    inputTextSplit.Insert(0,null);
    var result = inputTextSplit.ToArray();
    

    分配一个新数组,使用Array.Copy

    var inputTextSplit = inputText.Split(' ');
    var result = new string[inputTextSplit.Length + 1];
    Array.Copy(inputTextSplit, 0, result, 1, inputTextSplit.Length);
    

    调整数组大小,并将第一个元素清空

    Array.Resize(ref inputTextSplit, inputTextSplit.Length + 1);
    Array.Copy(inputTextSplit, 0, inputTextSplit, 1, inputTextSplit.Length - 1);
    inputTextSplit[0] = null;
    

    使用Span.. 只是为了搞笑

    var inputTextSplit = Console.ReadLine().Split(' ');
    var result = new string [inputTextSplit.Length + 1];
    inputTextSplit.AsSpan().CopyTo(new Span<string>(result)[1..]);
    

    你自己的迭代器方法

    public static class Extensions
    {
       public static IEnumerable<string> MyOwnFunkySplit(this string source)
       {
          yield return null;
          foreach (var item in source.Split(' '))
             yield return item;
       }
    }
    
    ...
    
    var inputTextSplit = Console
         .ReadLine()
         .MyOwnFunkySplit()
         .ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2020-09-18
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      相关资源
      最近更新 更多