如何使用LINQ拆分字符串并获取指定的标记

时间:2010-11-02 07:48:18

标签: c# linq-to-objects

我有一个制表符分隔的字符串,格式如下:

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();

2 个答案:

答案 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()