Лучше использовать
int x = points.Min(p => p.X);
var result = points.First(p => p.X == x);
как это устраняет необходимость сортировки этого списка (то есть, это O(n)
в отличие, скажем, O(n log n)
). Кроме того, это более понятно, чем использование OrderBy
и First
.
Можно даже написать метод расширения следующим образом:
static class IEnumerableExtensions {
public static T SelectMin<T>(this IEnumerable<T> source, Func<T, int> selector) {
if (source == null) {
throw new ArgumentNullException("source");
}
int min = 0;
T returnValue = default(T);
bool flag = false;
foreach (T t in source) {
int value = selector(t);
if (flag) {
if (value < min) {
returnValue = t;
min = value;
}
}
else {
min = value;
returnValue = t;
flag = true;
}
}
if (!flag) {
throw new InvalidOperationException("source is empty");
}
return returnValue;
}
Использование:
IEnumerable<Point> points;
Point minPoint = points.SelectMin(p => p.X);
Вы можете обобщить для ваших нужд. Преимущество этого заключается в том, что он избегает потенциальной ходьбы по списку дважды.
Если моя логика не сбивает меня .Min() должен проверять каждый элемент? Затем он возвращает это значение. Сначала сначала начинается один и тот же список, пока он не найдет первую точку с этим значением X. Худший случай, что 2 * n? –
Я добавил метод расширения для решения этой проблемы. Во-вторых, '2 * n' является' O (n) '. – jason