【问题标题】:splitting string into array with a specific number of elements, c#将字符串拆分为具有特定数量元素的数组,c#
【发布时间】:2012-07-04 08:27:38
【问题描述】:

我有一个字符串,其中包含由行 (\n) 分隔的有序术语的数量,如下例所示:(注意,我拥有的字符串是字符串数组的元素)

term 1
term 2
.......
.......
term n

我想拆分特定数量的术语,让我们只说 (1000) 并丢弃其余的术语。我正在尝试以下代码:

string[] training = traindocs[tr].Trim().Split('\n');
                List <string> trainterms = new List<string>();
                for (int i = 0; i < 1000; i++)
                {
                    if (i >= training.Length)
                        break;
                    trainterms.Add(training[i].Trim().Split('\t')[0]);
                } 

我可以在不使用 List 或任何其他数据结构的情况下执行此操作吗?我的意思是直接将特定数量的术语提取到数组(训练)中??提前致谢。

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    LINQ 怎么样? .Take() 扩展方法似乎符合您的要求:

    List<string> trainterms = traindocs[tr].Trim().Split('\n').Take(1000).ToList();
    

    【讨论】:

      【解决方案2】:

      根据MSDN,您可以使用split 方法的重载版本。

      public string[] Split( char[] separator, int count, StringSplitOptions 选项)

      参数

      分隔符 类型:System.Char[] Unicode 字符数组 分隔此字符串中的子字符串,一个空数组,不包含 分隔符,或为空。

      count 类型:System.Int32 最大数量 要返回的子字符串。

      选项类型:System.StringSplitOptions StringSplitOptions.RemoveEmptyEntries 省略空数组元素 从返回的数组中;或 StringSplitOptions.None 包括空 返回的数组中的数组元素。

      返回值

      类型:System.String[] 一个数组,其元素包含子字符串 在这个由一个或多个字符分隔的字符串中 分隔器。有关详细信息,请参阅备注部分。

      类似这样:

      String str = "A,B,C,D,E,F,G,H,I";
                  String[] str2 = str.Split(new Char[]{','}, 5, StringSplitOptions.RemoveEmptyEntries);
                  System.Console.WriteLine(str2.Length);
                  System.Console.Read();
      

      将打印:5

      编辑: 经过进一步调查,count 参数似乎只是指示拆分何时停止。字符串的其余部分将保留在最后一个元素中。

      因此,上面的代码将产生以下结果:[0] = A, [1] = B, [2] = C, [3] = D, [4] = E,F,G,H,I,这似乎不是您想要的。

      要解决此问题,您需要执行以下操作:

      String str = "A\nB\nC\nD\nE\nF\nG\nH\nI";
                  List<String> myList = str.Split(new Char[]{'\n'}, 5, StringSplitOptions.RemoveEmptyEntries).ToList<String>();
                  myList[myList.Count - 1] = myList[myList.Count - 1].Split(new Char[] { '\n' })[0];
                  System.Console.WriteLine(myList.Count);
                  foreach (String str1 in myList)
                  {
                      System.Console.WriteLine(str1);
                  }
                  System.Console.Read();
      

      上面的代码将只保留前 5 个(在您的情况下为 1000 个)元素。因此,如果您愿意,我认为达林的解决方案可能会更干净。

      【讨论】:

      • 你能根据原帖多解释一下吗?谢谢
      • @Qaesar:我已经更新了我的答案。我测试了代码并发布了我发现的内容。我认为不删除帖子可能是个好主意,因为与 more 最近的 LinQ 相比,这个问题展示了 traditional(如果你愿意的话)编程的案例。
      【解决方案3】:

      如果你想要最有效(最快)的方式,你必须使用 String.Split 的重载,传递所需的项目总数。

      如果您想要简单的方法,请使用 LINQ。

      【讨论】:

      • @Tilak,两种方式在耗时方面有区别吗?谢谢。
      • String.Split 重载,仅使用单个循环。 LINQ 将使用 2 个循环,一个用于 String.Split,另一个用于 Take。会有差异(但不是很明显)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多