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

时间:2011-06-29 16:55:56

标签: c#-4.0 linq-to-objects

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

6 个答案:

答案 0 :(得分:41)

它不会更有效率,但是做一些像以下事情会更清晰:

var strings = new string[] { "1", "02", "003", "0004", "00005" };

string longest = strings.OrderByDescending( s => s.Length ).First();

输出:00005

答案 1 :(得分:13)

strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed);

聚合语法比其他方法稍微难以阅读,但严格来说,它比我在这里看到的其他方法更有效,因为它不需要排序。只是一个O(N)实现。

编辑:这种方法与大多数其他方法一起假设列表中没有空值,以免f.Length抛出空引用异常。一个快速的三元运算符(f!= null?f.Length:0)会修复它,如果它对你的可枚举有效。

答案 2 :(得分:9)

string [] strings;
return strings.OrderByDescending (s => s.Length).First ();

答案 3 :(得分:2)

string[] arr = new string[] { "a", "aa", "aaa" };

var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();

输出aaa

这样代码显然可以获得最大长度的字符串。

答案 4 :(得分:2)

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

答案 5 :(得分:-1)

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

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