иерархический Макс в LAMBDA ИЛИ LINQ - PullRequest
0 голосов
/ 10 мая 2011

У меня есть список версий сборки

List<int[]> BuildVersions;

Как найти последнюю версию сборки.

Версии сборки, такие как

100.1.2.3
101.12.3.2
101.12.3.3

Обновление : выражение должно проверять сначала число, затем второе, затем третье, затем последнее

Ответы [ 4 ]

5 голосов
/ 10 мая 2011
int[] maxVersion = buildVersions.OrderByDescending(v => v[0])
                                .ThenByDescending(v => v[1])
                                .ThenByDescending(v => v[2])
                                .FirstOrDefault();

ИЛИ более общее решение, как в

T[] HierarchicalMax<T>(IEnumerable<T[]> items)
        {
            var length = items.Min(v => v.Length);
            IEnumerable<T[]> result = items;

            for (int i = 0; i < length; i++)
            {
                int offset = i;
                result = result.OrderByDescending(v => v[offset]);
            }

            T[] max = result.FirstOrDefault();

            return max;
        }
0 голосов
/ 10 мая 2011

Немного неэффективно, поскольку каждый раз находит минимальную длину текущего набора отфильтрованных версий.Время этого можно обменять на место за дополнительную плату, усложняющую код.Предполагается, что 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;  
}
0 голосов
/ 10 мая 2011

Если я правильно понимаю, у вас есть список массивов целых чисел, и вы хотите определить где-нибудь самое высокое значение int там.

Это будет примерно так:

var max = BuildVersions.Max(x => x.Max(y => y));
0 голосов
/ 10 мая 2011

У вас есть список массива int?

Если нет,

int maxValue=BuildVersions.Max();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...