Как разделить строку с помощью LINQ и получить указанный токен - PullRequest
3 голосов
/ 02 ноября 2010

У меня есть строка с разделителями табуляции в следующем формате:

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 ]

6 голосов
/ 02 ноября 2010

Зачем вам нужно использовать 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];
2 голосов
/ 02 ноября 2010

Не заставляйте себя использовать LINQ. Почему вы используете

(from str in line.Split('\t') select str).ToArray()

вместо

line.Split('\t')

Еще одно усовершенствование - не посещать элементы, использующие индекс напрямую, без проверки. Лучше сначала проверить, чтобы избежать исключения вне диапазона.

И последнее, что вы получите, это строка, нет необходимости снова вызывать .ToString().

...