【发布时间】:2011-06-29 16:55:56
【问题描述】:
我有一个可变长度的字符串数组。目前我有一个循环遍历数组以查找数组中最长的字符串。有什么方法可以使用 LINQ 以更高效和/或更简洁的方式编写它?
【问题讨论】:
标签: c# linq-to-objects
我有一个可变长度的字符串数组。目前我有一个循环遍历数组以查找数组中最长的字符串。有什么方法可以使用 LINQ 以更高效和/或更简洁的方式编写它?
【问题讨论】:
标签: c# linq-to-objects
它不会更有效率,但是这样做会更干净一些:
var strings = new string[] { "1", "02", "003", "0004", "00005" };
string longest = strings.OrderByDescending( s => s.Length ).First();
输出:00005
【讨论】:
strings.Aggregate(string.Empty, (seed, f) => f?.Length ?? 0 > seed.Length ? f : seed);
聚合语法比其他方法略难阅读,但严格来说,它比我在这里看到的其他方法更有效,因为它不需要排序。只是一个 O(N) 实现。
编辑:此方法以及此处的大多数其他方法都假定您的列表中没有空值,以免 f.Length 引发空引用异常。一个快速的三元运算符 (f != null ? f.Length : 0) 会解决这个问题,如果它对您的可枚举有效。
编辑(2.5 年后):空值合并优于三元空值检查。
【讨论】:
string [] strings;
return strings.OrderByDescending (s => s.Length).First ();
【讨论】:
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();
输出aaa
这样,代码显然可以得到最大长度的字符串。
【讨论】:
strings.OrderByDescending( s => s.Length ).First(); 将在我的机器上返回大约 15 个 CPU 滴答声,而这大约需要 390 个滴答声。
尽管这是一个老问题,但我想补充一点,没有提供最有效的答案。它不是单行,但它是最快的,并返回最长字符串的集合,而 OrderBy 或 Aggregate 不提供。 Matt Ellen 最接近他的答案,但在他的 Where 中使用 Max 会使您在处理大型收藏时变得相当慢。
正确答案应该是:
int maxLength = collection.Max(x => x.Length);
string[] longestStrings = collection.Where(x => x.Length == maxLength).ToArray();
考虑使用 ?。 (在 C# 6.0 中)和 ??运算符来检查您的集合是否可以包含这些空值。
【讨论】:
我现在没有编译器,但这也可以。
string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)
【讨论】: