Il est préférable d'utiliser
int x = points.Min(p => p.X);
var result = points.First(p => p.X == x);
car cela élimine la nécessité de trier cette liste (par exemple, il est O(n)
par opposition à, disons, O(n log n)
). En outre, il est plus clair que d'utiliser OrderBy
et First
.
Vous pouvez même écrire une méthode d'extension comme suit:
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;
}
Utilisation:
IEnumerable<Point> points;
Point minPoint = points.SelectMin(p => p.X);
Vous pouvez généraliser à vos besoins. L'avantage de ceci est qu'il évite potentiellement de parcourir deux fois la liste.
À moins que ma logique ne m'échoue .Min() doit inspecter chaque élément? Ensuite, il renvoie cette valeur. Tout d'abord recommence à parcourir la même liste, jusqu'à ce qu'il trouve le premier point avec cette valeur X. Pire des cas c'est 2 * n? –
J'ai ajouté une méthode d'extension pour résoudre ce problème. Deuxièmement, '2 * n' est' O (n) '. – jason