如何切换该代码以使用LINQ

时间:2011-09-20 13:58:50

标签: c# .net linq

我知道good practice使用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 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

您可以使用Zip方法

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

在上面的语句中,i是来自priorsLstIds的项目,d是来自priorsLstDates的项目。他们将使用他们在列表中的位置“压缩”在一起。

答案 2 :(得分: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();

答案 3 :(得分:2)

这根本不是最佳做法,只有当您认为它会提高对性能损失的可读性时才会这样做。

LINQ-to-Objects通常会增加一些边际开销(多个迭代器等)。它仍然必须执行循环,并且具有委托调用,并且通常必须进行一些额外的解除引用以获取捕获的变量等。

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