【问题标题】:How can I switch that code to use LINQ如何切换该代码以使用 LINQ
【发布时间】:2011-11-21 03:09:06
【问题描述】:

我知道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的一部分吗?

【问题讨论】:

  • 不要仅仅因为您阅读了它而切换它是一种很好的做法。例如,在紧密循环中,迭代代码可以更快。
  • 我会补充。在某些情况下,迭代循环对其他人来说更容易修改。不要因为你有一把锤子就把所有东西都变成钉子。
  • @Delashmate:这个方法的主体是什么?

标签: c# .net linq


【解决方案1】:
IEnumerable<PriorElemSt> priorsElemLst = priorsLstIDs.Select((s,i) => new PriorElemSt(s, priorsLstDates[i]));
return filterStudyPriors(priorsElemLst);

【讨论】:

  • 签名是 IEnumerable
  • @Delashmate:那我回答的第二部分更适合你。
  • 这不会编译,在你的回答中i 将是一个字符串,但需要是一个整数才能作为索引传递给列表。
  • @DoctaJonez:现在可以了。谢谢。
  • 你可以缩短它,因为s已经是priorsLstIDs[i]
【解决方案2】:

您可以像这样使用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】:

    你可以使用Zip方法

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

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

    【讨论】:

      【解决方案4】:

      这根本不是最佳实践,但前提是您认为它会提高可读性以防止性能损失。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 2021-10-13
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        相关资源
        最近更新 更多