Как создать строку [] в запросе LINQ через Regex.Split () - PullRequest
4 голосов
/ 18 ноября 2011

Я анализирую запятую с помощью LINQ. В запросе LINQ я вызываю Regex.Split несколько раз, чтобы проанализировать элементы, разделенные запятыми. Я пытаюсь выяснить, как мне избежать многократного вызова метода .Split (), но мне не удается это выяснить.

Пример:

// Sample data
string data = @"A,1,Foo1,14:03:08,14/11/11,
A,2,Foo2,11:51:11,09/11/11,
A,3,Foo3,11:51:11, 09/11/11,
A,4,Foo4,12:11:13,09/11/11,
A,5,Foo5,12:23:02,13/11/11,
A,6,Foo6,15:37:58,11/11/11";

// Add each line of data into an array
string[] dataSplit = Regex.Split(data,"\r\n");

// Create an anon object for each line item
var rows = from a in dataSplit
    select new {
    Name    = Regex.Split(a, ",")[0],
    ID  = Regex.Split(a, ",")[1],
    Val     = Regex.Split(a, ",")[2],
    Time    = Regex.Split(a, ",")[3],
    Date    = Regex.Split(a, ",")[4]
    };

Обратите внимание, что в запросе LINQ я вызываю Regex.Split, чтобы определить значение индекса для каждой позиции. Интуитивно, мне кажется, что вызов .Split () для каждого anon prop не требует дополнительных затрат.

Как я могу создать переменную в запросе LINQ, которая разделяет строку в области видимости, так что при установке свойства объекта anon мне не нужно вызывать метод Regex.Split ()?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

Вы можете сохранить подвыражение в переменной с помощью предложения let .

var rows = from a in dataSplit
    let splitResult = Regex.Split(a, ",")
    select new {
        Name    = splitResult [0],
        ID      = splitResult [1],
        Description = splitResult [2],
        Time    = splitResult [3],
        Date    = splitResult [4]
    };
1 голос
/ 18 ноября 2011

Вы можете использовать предложение let, чтобы вызвать его только один раз:

var rows = from a in dataSplit
    let splitValues = Regex.Split(a, ",")
    select new {
        Name    = splitValues[0],
        ID      = splitValues[1],
        Val     = splitValues[2],
        Time    = splitValues[3],
        Date    = splitValues[4]
    };

В качестве примечания: если вы просто разделяете на основе определенного символа или строки, а не выражения , вам следует просто использовать String.Split:

string[] dataSplit = data.Split(new[] {Environment.NewLine}, StringSplitOptions.None);

var rows = from a in dataSplit
    let splitValues = a.Split(",")
    select new {
        Name    = splitValues[0],
        ID      = splitValues[1],
        Val     = splitValues[2],
        Time    = splitValues[3],
        Date    = splitValues[4]
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...