LAMBDA 或 LINQ 中的分层 Max

发布于 2024-11-06 00:27:16 字数 243 浏览 1 评论 0原文

我有一个构建版本列表

List<int[]> BuildVersions;

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

构建版本,例如

100.1.2.3
101.12.3.2
101.12.3.3

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

I have a build version list

List<int[]> BuildVersions;

How can i find last build version.

Build Versions such as

100.1.2.3
101.12.3.2
101.12.3.3

Update: the expression must check first number then second one,then third one ,then last one

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无畏 2024-11-13 00:27:16
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;
        }
int[] maxVersion = buildVersions.OrderByDescending(v => v[0])
                                .ThenByDescending(v => v[1])
                                .ThenByDescending(v => v[2])
                                .FirstOrDefault();

OR a more generic solution is as under

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;
        }
时光与爱终年不遇 2024-11-13 00:27:16

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

那会是这样的:

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

If I understand correctly, you have a list of arrays of ints, and you want to determine the highest int in there somewhere.

That would be something like this:

var max = BuildVersions.Max(x => x.Max(y => y));
春花秋月 2024-11-13 00:27:16

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

A little inefficient as it finds the minimum length of the current set of filtered versions each time. The time of this could be traded for space at the additional cost of complicating the code. It assumes 1.1 is greater than 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();

With the extension method:

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;  
}
影子是时光的心 2024-11-13 00:27:16

你有 int 数组的列表吗?

如果不,

int maxValue=BuildVersions.Max();

Have you a list of int array?

If not,

int maxValue=BuildVersions.Max();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文