Better to use
int x = points.Min(p => p.X);
var result = points.First(p => p.X == x);
since this eliminates the need to sort this list (i.e. O(n), unlike, say, O(n log n)). In addition, it is more clear than using OrderByand First.
You can even write an extension method as follows:
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;
}
Using:
IEnumerable<Point> points;
Point minPoint = points.SelectMin(p => p.X);
. , .