【问题标题】:C# List Lambda with index, object and DoStuff() / to arrayC# 使用索引、对象和 DoStuff() 列出 Lambda / 到数组
【发布时间】:2018-03-13 09:44:47
【问题描述】:

有什么方法可以简化这段代码吗?

double[] timeline = new double[dataList.Count];

for (int i = 0; i < dataList.Count; i++){
          timeline[i] = dataList[i].position;
}

return timeline;

第一个想法:

new double[datalist.ToArray("lambda which selects all .position attributes") <- is this possible?

第二个想法:

datList.Select((x, i) => timeline[i] = x)

一些链接,但这不起作用...我搜索了很多,找不到任何解决方案。

我想简化它,因为我喜欢 lamda 表达式并且我想了解更多关于它们的信息。

【问题讨论】:

    标签: c# list linq lambda generic-collections


    【解决方案1】:

    除非我在这里遗漏了一些明显的东西,否则为什么不简单地使用Select 和ToArray?

    double[] timeline = dataList.Select(d => d.position).ToArray();
    

    【讨论】:

    • @TimSchmelter 为什么不在这里使用var?
    • 因为问题是关于如何使用 LINQ 创建 double[] 并且类型不明显。我只是想澄清一下,OP 得到了他的要求,var 混淆了这一点。
    • 我对此进行了测试,但尝试了 double[] timeline = new double[dataList.Select(d => d.position).ToArray()];这给了我一个错误,因为它期望一个int ...我无法理解错误消息,感谢这项工作! @TimSchmelter 还有一种方法可以在 select lambda 中“做事”吗?因为它是唯一可以从中获取索引和对象的对象
    • @ScriptWorld 写一个函数并在select中调用它:items.Select((d,index) =&gt; SomeInportantFunction(d.position,index))
    • @ScriptWorld:嗯,LINQ 查询不应该“做事”。它应该查询一些东西。不要让它产生副作用。每当您“触摸”此查询时,您都会触发它们(例如,调用 ToList 或在 foreach 中枚举它)。而是查询您想要“做事”的所有内容。然后使用一个普通的foreach-loop 来实际执行它。
    【解决方案2】:

    您可以简单地使用投影(即Select LINQ 方法):

    IEnumerable<double> timeLine = dataList.Select(dl => dl.position);
    

    如果需要转成数组,可以使用ToArray方法

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多