在用户定义的列表中查找具有最大字符数的类对象的项目

我是 LINQ 的新手,我遇到过一个场景,我只能用单个表达式而不是循环来执行任务。

在自定义类数组中以及该数组中特定的字符串参数最大长度?

StringBuilder sb = new StringBuilder();
        CultureInfo[] cinfo = CultureInfo.getcultures(CultureTypes.AllCultures);
        foreach (CultureInfo ci in cinfo)
        {
            sb.Append(ci.Name + "," + ci.TwoLetterISOLanguageName + "," + ci.ThreeLetterISOLanguageName + "," + ci.ThreeLetterWindowsLanguageName + "," + ci.DisplayName + "," + ci.EnglishName + Environment.NewLine);
        }
        lb.Items.Add(sb.ToString());
        txtData.Text = sb.ToString();

这里 cinfo 是集合,我想找出整个数组中 Name 参数中具有最大字符的元素。

q125090465 回答:在用户定义的列表中查找具有最大字符数的类对象的项目

您可以按Name的长度排序,然后取第一个:

var cultureWithLongestName = CultureInfo
    .GetCultures(CultureTypes.AllCultures)
    .OrderByDescending(x => x.Name.Length)
    .FirstOrDefault();
,

执行此类操作的最简单方法是按长度排序并取第一个元素。我们可以这样做:

var elementWithLongestName = collection.OrderByDescending(e => e.Name.Length).First();

然而,使用 OrderByDescending 排序会给你 O(nlog(n)) 时间复杂度(它使用快速排序)。我们可以做得更好!我们可以用线性时间 (O(n)) 解决这个问题:

使用 .NET 5.0 或更低版本

不幸的是,在 .NET 6.0(目前处于预览版)之前,没有内置的 LINQ 运算符可以通过其属性之一找到最大元素。无论如何,我们有两种方法可以实现这一目标:

使用香草 LINQ

我们可以在集合中找到最大长度,然后找到具有该长度的元素:

var longestNameLength = collection.Select(e => e.Name.Length).Max();
var elementWithLongestName = collection.First(e => e.Name.Length == longestNameLength);

这种方法的一个缺点(除了更冗长)是我们要对同一个集合进行两次枚举。在您的情况下,这很好,因为源集合是一个简单的内存数组。如果源集合是一个更复杂的 IEnumerable(例如从数据库中延迟加载项目的集合),最好先使用 ToList()ToArray()

使用 MoreLinq

您可以使用流行的包 MoreLinq 来实现您的要求:

var elementWithLongestName = collection.MaxBy(e => e.Name.Length);

使用 .NET 6.0 及更高版本

在此版本中,MaxBy 运算符(完全满足您的需求)是开箱即用的,无需使用第三方库。你可以写:

var elementWithLongestName = collection.MaxBy(e => e.Name.Length);

注意:.NET 6.0 的稳定版本计划于 2021 年 11 月发布。

本文链接:https://www.f2er.com/17078.html

大家都在问