我有一个字符串,其中包含由行(\ 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或任何其他数据结构的情况下执行此操作吗?我的意思是直接将特定数量的术语提取到数组(训练)中?提前谢谢。
答案 0 :(得分:7)
LINQ怎么样? .Take()扩展方法似乎适合您的帐单:
List<string> trainterms = traindocs[tr].Trim().Split('\n').Take(1000).ToList();
答案 1 :(得分:2)
根据MSDN,您可以使用split
方法的重载版本。
public string [] Split(char [] separator,int count, StringSplitOptions选项)
参数
separator类型:System.Char []一个Unicode字符数组 分隔此字符串中的子字符串,一个包含no的空数组 分隔符,或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个)元素。因此,如果你愿意的话,我认为达林的解决方案可能会更清晰。
答案 2 :(得分:1)
如果您想要最有效(最快)的方式,则必须使用String.Split
的重载,并传递所需的项目总数。
如果您想轻松一点,请使用LINQ。