LINQ меняет локальную переменную let - PullRequest
1 голос
/ 30 октября 2011

Используя запрос 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 ]

2 голосов
/ 30 октября 2011

Я полагаю, вы ищете кратный (он же "уменьшить"), который в LINQ известен как Aggregate .

( IEnumerable.Min / Max являются особыми случаями, но могут быть записаны в терминах сложения / агрегирования.)

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 голос
/ 30 октября 2011

Вы фактически находите минимальное значение в коллекции, если оно существует:

int? best = null;
if (collection != null && collection.Length > 0) best = collection.Min();
1 голос
/ 30 октября 2011

Похоже, вы просто выбираете минимальное значение.

var minimum = collection.Min( c => c );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...