LINQ更改本地“let”变量

时间:2011-10-29 21:43:35

标签: c# linq variables

使用LINQ查询(使用C#)我将如何做这样的事情(伪代码)?

我希望做这样的事情,例如,我可能生成1000个100的随机(有界)整数列表,我想跟踪它们生成时的最小值。

Best <- null value 

Foreach N in Iterations
    NewList <- List of 100 randomly generated numbers
    If Best is null
        Best <- NewList

    If Sum(NewList) < Sum(Best)
        Best <- NewList

Select Best

我尝试过各种各样的事情,但我真的无法让它发挥作用。这不是针对任何类型的项目或工作,只是为了我自己的好奇心!

我在想的例子:

let R = new Random()   
let Best = Enumerable.Range(0, 100).Select(S => R.Next(-100, 100)).ToArray()

//Where this from clause is acting like a for loop 
from N in Iterations 
    let NewList = Enumerable.Range(0, 100).Select(S => R.Next(-100, 100))
    Best = (NewList.Sum() < Best.Sum())? NewList : Best;

select Best

3 个答案:

答案 0 :(得分:2)

我相信你正在寻找fold(又名“减少”),这在LINQ中被称为Aggregate

IEnumerable.Min / Max是特例,但可以用fold / Aggregate来编写。)

int Max (IEnumerable<int> x) {
  return x.Aggregate(int.MinValue, (prev, cur) => prev > cur ? prev : cur);
}
Max(new int[] { 1, 42, 2, 3 }); // 42

快乐的编码。

答案 1 :(得分:1)

看起来你只是选择了最小值。

var minimum = collection.Min( c => c );

答案 2 :(得分:1)

您正在有效地找到集合中的最小值(如果存在):

int? best = null;
if (collection != null && collection.Length > 0) best = collection.Min();