Я предлагаю написать свой собственный метод расширения (отредактированный, чтобы быть универсальным с ограничением IComparable<T>
.)
public static int MaxIndex<T>(this IEnumerable<T> sequence)
where T : IComparable<T>
{
int maxIndex = -1;
T maxValue = default(T); // Immediately overwritten anyway
int index = 0;
foreach (T value in sequence)
{
if (value.CompareTo(maxValue) > 0 || maxIndex == -1)
{
maxIndex = index;
maxValue = value;
}
index++;
}
return maxIndex;
}
Обратите внимание, что возвращается -1, если последовательность пуста.
Слово по характеристикам:
- Это работает с последовательностью, которая может быть перечислена только один раз - иногда это может быть очень важным и, как правило, является желательной функцией IMO.
- Сложность памяти O (1) (в отличие от O (n) для сортировки)
- Сложность во время выполнения O (n) (в отличие от O (n log n) для сортировки)
Что касается того, является ли это "LINQ" или нет: если бы оно было включено в качестве одного из стандартных операторов запросов LINQ, вы бы посчитали его как LINQ? Чувствует ли это себя особенно чуждым или непохожим на других операторов LINQ? Если бы MS включила его в .NET 4.0 в качестве нового оператора, это было бы LINQ?
РЕДАКТИРОВАТЬ: Если вы действительно, действительно, одержимы использованием LINQ (вместо того, чтобы просто получить элегантное решение), то вот тот, который все еще O (n) и оценивает последовательность только один раз:
int maxIndex = -1;
int index=0;
double maxValue = 0;
int urgh = sequence.Select(value => {
if (maxIndex == -1 || value > maxValue)
{
maxIndex = index;
maxValue = value;
}
index++;
return maxIndex;
}).Last();
Это отвратительно, и я не советую вам вообще его использовать - но оно будет работать.