我知道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的一部分?
答案 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通常会增加一些边际开销(多个迭代器等)。它仍然必须执行循环,并且具有委托调用,并且通常必须进行一些额外的解除引用以获取捕获的变量等。