Интерфейс типа IComparable для частичного упорядочения - PullRequest
3 голосов
/ 25 марта 2012

Я пытаюсь определить универсальную функцию, чтобы дать наибольшее значение набора параметров. Это выглядит так:

    public static TResult Max<TResult>(params TResult[] items)
    {
        TResult result = items[0];
        foreach (var item in items)
        {
            if (item > result)
                result = item;
        }
        return result;
    }

Это все хорошо, за исключением того, что компилятор хрипит в строке "item> result". Что мне нужно, так это способ ограничить TResult наличием оператора> (или <тоже будет работать). Однако я не вижу легкодоступного интерфейса для этого. Поскольку это частичное упорядочение, это кажется довольно распространенной задачей. Я что-то упустил в гигантской документации .NET? </p>

Ответы [ 2 ]

5 голосов
/ 25 марта 2012

Вы можете использовать IComparable:

public static IComparable Max<TResult>(params IComparable[] items)
{
    IComparable result = items[0];
    foreach (var item in items)
    {
        if (item.CompareTo(result) > 0)
            result = item;
    }
    return result;
}
2 голосов
/ 25 марта 2012

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

Наиболее распространенное решение - пройти метод сравнения компаратора.

Вы также можете использовать только часть IComparable или IComparer интерфейсов с надписью «это лучше» и игнорировать 2 других значения.

IComparable и IComparer<in T>, который используется через запросы LINQ. То есть см OrderBy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...