如何使用LINQ查找字符串[]中最长的字符串

本文关键字:字符串 何使用 LINQ 查找 | 更新日期: 2023-09-27 18:00:37

我有一个可变长度的字符串数组。目前,我有一个循环,它遍历数组以找到数组中最长的字符串。有没有什么方法可以使用LINQ以更高效和/或更干净的方式编写它?

如何使用LINQ查找字符串[]中最长的字符串

虽然效率不会高很多,但做一些类似的事情会更干净一些

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)实现。

编辑:这种方法和这里的大多数其他方法都假设列表中没有null值,以免f.Length抛出null ref异常。如果快速三元运算符(f!=null?f。长度:0)对您的可枚举对象有效,它将修复此问题。

EDIT(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

通过这种方式,代码可以清楚地获得最大长度的字符串。

尽管这是一个老问题,但我想补充一点,并没有提供最有效的答案。它不是一个单行,但它是最快的,并返回最长字符串的集合,而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中)和??运算符来检查空值(如果您的集合可以包含这些值)。

由于.NET 6,您可以使用MaxBy方法。它是O(N)和直接的:

var strings = new string[] { "1", "02", "003", "0004", "00005" };
string? longest = strings.MaxBy(s => s.Length); // longest == "00005"

我现在没有编译器,但这也可以。

string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)