我有一个制表符分隔的字符串,格式如下:
string line = "D\t892270\t88418\t6\t2452927\t-99999\t-99999\t12";
我想要的是获取通过indexToGet
指定的令牌的价值。
我已经编写了以下LINQ查询来执行此操作,我确信可以进行很多改进,但目前我无法这样做。有人可以为我改进这个LINQ查询吗?
int indexToGet = 7;
var val =
(from str in line.Split('\t')
select str).ToArray().GetValue(indexToGet).ToString();
答案 0 :(得分:6)
为什么需要使用LINQ?以下代码在没有LINQ开销的情况下解决了它:
var val = line.Split('\t')[indexToGet];
澄清:使用您使用的查询理解语法,无法指定您只需要在给定位置的元素。因此,使用LINQ,您将不得不依赖ElementAt
扩展方法。所以减少的第一次迭代你可以替换.ToArray().GetValue(indexToGet).ToString();
并得到这个:
var val =
(from str in line.Split('\t')
select str).ElementAt(indexToGet);
此外,由于查询部分除了花哨之外没有任何价值(并且使代码难以阅读),您可以减少到这个:
var val = line.Split('\t').ElementAt(indexToGet);
接下来,因为在这种情况下ElementAt
正在索引到一个数组,所以直接使用索引器会更快:
var val = line.Split('\t')[indexToGet];
答案 1 :(得分:2)
不要强迫自己使用LINQ。为什么使用
(from str in line.Split('\t') select str).ToArray()
而不是
line.Split('\t')
另一个需要改进的地方是不使用索引直接访问元素而不进行检查。你最好先检查一下,以避免超出范围的例外。
最后,你得到的是一个字符串,没有必要再次拨打.ToString()
。