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