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

Find a Class object's Item with Maximum character count in a User Defined List

我是 LINQ 的新手,我遇到了一种情况,我不得不用单个表达式而不是循环来执行任务。

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

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 参数中具有最大字符的元素。

您可以按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 月发布。