Кратчайший код для расчета списка мин / макс в .NET - PullRequest
9 голосов
/ 30 октября 2008

Я бы хотел что-то вроде

int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});

Есть ли встроенный способ сделать это в .NET?

Ответы [ 4 ]

19 голосов
/ 30 октября 2008

Попробуйте посмотреть на это:

Min

Макс

Пока ваш класс реализует IComparable, все, что вам нужно сделать, это:

List<MyClass> list = new List();
//add whatever you need to add

MyClass min = list.Min();
MyClass max = list.Max();
10 голосов
/ 31 октября 2008

Ну, если вы не можете использовать .NET 3.5, вы всегда можете отсортировать список и затем вернуть список [0]. Это может быть не самый быстрый способ, но это, вероятно, самый короткий код, особенно если ваш класс уже реализует IComparable.

List<SomeClass> list = new List<SomeClass>();
// populate the list
// assume that SomeClass implements IComparable
list.Sort();
return list[0];               // min, or
return list[list.Count - 1];  // max

Это также предполагает, конечно, что не имеет значения, какой предмет вы возвращаете, если у вас есть несколько предметов, которые являются минимальными или максимальными.

Если ваш класс не реализует IComparable, вы можете передать анонимного делегата, что-то вроде этого:

list.Sort(delegate(SomeClass x, SomeClass y) { return string.Compare(x.Name, y.Name); });
3 голосов
/ 30 октября 2008

Используя Linq, вы получаете функции Min () и Max ().

Так что вы можете сделать list.AsQueryable().Min();

2 голосов
/ 31 октября 2008

Вы заметили, что "Я все еще в 2" - тогда вы можете посмотреть на LINQBridge . Это на самом деле нацелено на C # 3.0 и .NET 2.0, но вы должны иметь возможность использовать его с C # 2.0 и .NET 2.0 - просто вам придется использовать длинную руку:

MyClass min = Enumerable.Min(list),
        max = Enumerable.Max(list);

Конечно, будет проще, если вы перейдете на C # 3.0 (все еще ориентируясь на .NET 2.0).

А если LINQBridge не вариант, вы можете реализовать его самостоятельно:

static void Main()
{
    int[] data = { 3, 5, 1, 5, 5 };
    int min = Min(data);
}
static T Min<T>(IEnumerable<T> values)
{
    return Min<T>(values, Comparer<T>.Default);
}
static T Min<T>(IEnumerable<T> values, IComparer<T> comparer)
{
    bool first = true;
    T result = default(T);
    foreach(T value in values) {
        if(first)
        {
            result = value;
            first = false;
        }
        else
        {
            if(comparer.Compare(result, value) > 0) 
            {
                result = value;
            }
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...