如何通过Regex.Split()在LINQ查询中创建字符串[]

时间:2011-11-18 19:47:20

标签: c# linq parsing

我正在使用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来确定每个行项的索引值。直观地说,在我看来,为每个anon prop调用.Split()是不必要的开销。

如何在LINQ查询中创建一个变量来分割范围内的行,这样当我设置anon对象的属性时,我不必调用Regex.Split()方法?

2 个答案:

答案 0 :(得分:4)

您可以使用let clause将子表达式存储在变量中。

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 :(得分:1)

您可以使用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]
    };