Это не самый хороший код можно себе представить, но это ВГА е преимущества
- перечисляя только через всю коллекцию раз (хотя это действительно получает первое значение в три раза).
- Не требуется больше памяти для хранения IEnumerator и двух объектов
Tuple<int, int, long, long>
(которые у вас не было бы при использовании OrderBy
, ToList
и сортировке и т. Д.). Это позволяет работать с произвольно большими коллекциями IEnumerable.
- Одно выражение Linq (это то, что вы хотели).
- Обрабатывает крайние случаи (
values.Count() < 2
) правильно:
- , когда нет никаких значений, используя
Min()
и Max()
на IEnumerable выбросит InvalidOperationException
- , когда есть одна ценность, наивные реализации будут делать что-то вроде
Sum() - Min() - Max()
на IEnumerable который возвращает одно значение, отрицание.
Я знаю, что вы уже приняли ответ, но вот это: я использую один вызов Enumerable.Aggregate.
public static long SumExcludingMinAndMax(IEnumerable<int> values)
{
// first parameter: seed (Tuple<running minimum, running maximum, count, running total>)
// second parameter: func to generate accumulate
// third parameter: func to select final result
var result = values.Aggregate(
Tuple.Create<int, int, long, long>(int.MaxValue, int.MinValue, 0, 0),
(accumulate, value) => Tuple.Create<int, int, long, long>(Math.Min(accumulate.Item1, value), Math.Max(accumulate.Item2, value), accumulate.Item3 + 1, accumulate.Item4 + value),
accumulate => accumulate.Item3 < 2 ? 0 : accumulate.Item4 - accumulate.Item1 - accumulate.Item2);
return result;
}
Вы можете попробовать что-то вроде list.OrderBy (пункт => item.Score) Пропустите (1) .Снять (list.Count - 2) .sum (пункт => item.Score); Для справки я ненавижу себя сейчас, и это, вероятно, самый неоптимизированный кусок мусора. – wgraham
Вы можете определенно сделать это с помощью аккумулятора с * одной * оценкой перечислимого. (Я имею в виду использование агрегата). –
Зачем вам одно заявление? Не был бы простой 'list.Sum (item => item.Score) - list.Max() - list.Min()' более читабельным? Я сомневаюсь, что повторение списка три раза станет узким местом вашей заявки. –