2

我有一个字符串,其中包含由行 (\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 或任何其他数据结构的情况下执行此操作吗?我的意思是直接将特定数量的术语提取到数组(训练)中??提前致谢。

4

3 回答 3

7

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

List<string> trainterms = traindocs[tr].Trim().Split('\n').Take(1000).ToList();
于 2012-07-04T08:29:46.787 回答
2

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

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

参数

separator 类型:System.Char[] 用于分隔此字符串中的子字符串的 Unicode 字符数组、不包含分隔符的空数组或 null。

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

options 类型: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 个)元素。因此,如果您愿意,我认为达林的解决方案可能会更干净。

于 2012-07-04T08:34:39.313 回答
1

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

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

于 2012-07-04T08:35:51.847 回答