Немного неэффективно, поскольку каждый раз находит минимальную длину текущего набора отфильтрованных версий.Время этого можно обменять на место за дополнительную плату, усложняющую код.Предполагается, что 1.1 больше, чем 1.1.1.
for (int versionPart = 0; versionPart < versions.Min(v => v.Length); versionPart += 1) {
versions = versions.MaxValues(version => version[versionPart]);
}
var maxVersion = versions.FirstOrDefault();
При методе расширения:
public static IEnumerable<T> MaxItems<T>(this IEnumerable<T> list, Func<T, int> selector) {
var enumerator = list.GetEnumerator();
if (!enumerator.MoveNext()) {
return Enumerable.Empty<T>();
}
var maxItem = enumerator.Current;
List<T> maxItems = new List<T>() { maxItem };
int maxValue = selector(maxItem);
while (enumerator.MoveNext()) {
var item = enumerator.Current;
var value = selector(item);
if (value > maxValue) {
maxValue = value;
maxItems = new List<T>() { item };
} else if (value == maxValue) {
maxItems.Add(item);
}
}
return maxItems;
}