在用户定义的列表中查找具有最大字符数的类对象的项目
Posted
技术标签:
【中文标题】在用户定义的列表中查找具有最大字符数的类对象的项目【英文标题】:Find a Class object's Item with Maximum character count in a User Defined List 【发布时间】:2021-10-04 23:55:36 【问题描述】:我是 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 参数中具有最大字符的元素。
【问题讨论】:
【参考方案1】:您可以按Name
的长度订购,然后拿第一个:
var cultureWithLongestName = CultureInfo
.GetCultures(CultureTypes.AllCultures)
.OrderByDescending(x => x.Name.Length)
.FirstOrDefault();
【讨论】:
【参考方案2】:进行此类操作的最简单方法是按长度排序并获取第一个元素。我们可以这样做:
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 月发布。
【讨论】:
非常感谢您提出正确且先进的解决方案。以上是关于在用户定义的列表中查找具有最大字符数的类对象的项目的主要内容,如果未能解决你的问题,请参考以下文章