LAMBDA 或 LINQ 中的分层最大值



我有一个构建版本列表

List<int[]> BuildVersions;

如何找到最新的构建版本。

构建版本,例如

100.1.2.3
101.12.3.2
101.12.3.3

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

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

如果我理解正确,您有一个整数数组列表,并且您想在某处确定其中的最高整数。

那将是这样的:

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

效率有点低,因为它每次都会找到当前过滤版本集的最小长度。可以以使代码复杂化的额外费用来换取空间。它假定 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;  
}

你有 int 数组的列表吗?

如果没有,

int maxValue=BuildVersions.Max();

相关内容

  • 没有找到相关文章

最新更新