2011-11-18 23 views
4

我使用LINQ解析逗號分隔的一組數據。在LINQ查詢中,我多次調用Regex.Split來解析逗號分隔的項目。我試圖找出如何避免多次調用.Split()方法,但我無法弄清楚。如何通過Regex.Split()在LINQ查詢中創建一個字符串[]

實施例:

// 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()方法?

回答

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] 
    }; 
+0

謝謝您的回答和你更多的建議,裏德。 – Jed

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] 
    }; 
相關問題