2011-09-20 34 views
5

我知道是good practice使用LINQ而不是迭代循環,我可以修改此代碼以使用LINQ嗎?我該如何切換該代碼以使用LINQ

List<string> priorsLstIDs = ServiceUtil.extractColumnValuesAsStringVals(tqrPriors,Helper.STUDY_ID); 
List<DateTime> priorsLstDates = ServiceUtil.extractColumnValuesAsDateTimeVals(tqrPriors, "STUDY_DATE"); 
List<PriorElemSt> priorsElemLst = new List<PriorElemSt>(priorsLstIDs.Count); 

PriorElemSt elem; 

for (int i = 0; i < priorsLstIDs.Count; i++) 
{ 
    elem = new PriorElemSt(priorsLstIDs[i], priorsLstDates[i]); 
    priorsElemLst.Add(elem); 
} 

return filterStudyPriors(priorsElemLst); 

謝謝。

更新:可以調用filterStudyPriors()方法可以成爲LINQ的一部分嗎?

+4

切換隻是因爲你閱讀它的良好做法。例如,在緊密循環中,迭代代碼可以更快。 –

+3

我會加。有些情況下,迭代循環對其他人來說更容易修改。不要因爲你有錘子而把所有東西都釘在一起。 – rerun

+0

我完全同意 –

回答

8
IEnumerable<PriorElemSt> priorsElemLst = priorsLstIDs.Select((s,i) => new PriorElemSt(s, priorsLstDates[i])); 
return filterStudyPriors(priorsElemLst); 
+0

簽名是IEnumerable Delashmate

+0

@Delashmate:那麼我的答案的第二部分更適合你。 – abatishchev

+0

這不會編譯,在你的答案中'i'將是一個字符串,但需要一個整數作爲索引傳遞給列表。 –

4

可以使用Zip方法

var priorsElemLst = priorsLstIDs.Zip(
    priorsLstDates, (i, d) => new PriorElemSt(i, d)) 

在上面的語句i是priorsLstIds和d從priorsLstDates該項目的項目。他們將在他們的名單中使用他們的職位「拉鍊」在一起。

2

這根本不是最佳實踐,但前提是您認爲它會提高可讀性而不是性能損失。

LINQ-to-Objects通常會添加一些邊際開銷(多個迭代器等)。它仍然有做循環,並具有委託裏調用,一般會做一些額外的解引用以獲得在拍攝變量等

Is a LINQ statement faster than a 'foreach' loop?

4

你可以使用Enumerable.Range方法,像這樣:

//first get the range of indexes 
var range = Enumerable.Range(0, priorsLstIDs.Count); 
//now project a list of elements at each index 
var priorsElemLst = range.Select(i => new PriorElemSt(priorsLstIDs[i], priorsLstDates[i])).ToList();