如何将代码转换为使用LINQ

5

我知道使用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
仅仅因为看到这是一种好的编程实践就去进行语言切换并不明智。例如,在紧凑的循环中,迭代代码可以更快。 - Roman Starkov
3
我想补充一点。在某些情况下,迭代循环更容易让其他人修改。不要仅仅因为你有一个锤子就把所有东西都当成钉子。 - rerun
@Delashmate:这个方法的主体是什么? - abatishchev
4个回答

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

签名是IEnumerable<PriorElemSt>。 - Delashmate
@Delashmate:那么我回答的第二部分更适合你。 - abatishchev
这段代码无法编译,因为在你的答案中 i 是一个字符串,但是需要将其转换为整数才能作为列表的索引传递。 - Doctor Jones
@DoctaJonez:现在可以了。谢谢。 - abatishchev
你可以缩短代码,因为s已经是priorsLstIDs[i]了。 - Ray

4
您可以使用Zip方法。该方法的详细信息请参见Zip
var priorsElemLst = priorsLstIDs.Zip(
    priorsLstDates, (i, d) => new PriorElemSt(i, d))

在上述语句中,i是来自priorsLstIds的项,d是来自priorsLstDates的项。它们将使用它们在列表中的位置进行“压缩”。

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();

2

这并不是最佳实践,只有在您认为它可以提高可读性而不会影响性能时才使用。

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

LINQ语句是否比“foreach”循环更快?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接