LAMBDA或LINQ中的分层Max

时间:2011-05-10 11:01:33

标签: c# linq lambda

我有一个构建版本列表

List<int[]> BuildVersions;

如何找到最新版本。

构建

等版本
100.1.2.3
101.12.3.2
101.12.3.3

更新:表达式必须检查第一个数字,然后是第二个,然后是第三个,然后是最后一个

4 个答案:

答案 0 :(得分:5)

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;
        }

答案 1 :(得分:0)

如果我理解正确,你有一个int数组列表,你想确定那里的最高int。

这将是这样的:

var max = BuildVersions.Max(x => x.Max(y => y));

答案 2 :(得分:0)

效率稍低,因为它每次都会找到当前过滤版本集的最小长度。这个时间可以交换空间,但需要额外的代价来复杂代码。假设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;  
}

答案 3 :(得分:-1)

你有一个int数组列表吗?

如果没有,

int maxValue=BuildVersions.Max();