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

C# 如何使用LINQ查找字符串[]中最长的字符串,c#,linq-to-objects,C#,Linq To Objects,我有一个长度可变的字符串数组。目前我有一个循环,循环遍历数组以查找数组中最长的字符串。有什么方法可以使用LINQ以更高效和/或更干净的方式编写它吗?效率不会更高,但是做以下事情会更干净一些: string [] strings; return strings.OrderByDescending (s => s.Length).First (); var strings = new string[] { "1", "02", "003", "0004", "00005" }; strin

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

效率不会更高,但是做以下事情会更干净一些:

string [] strings;
return strings.OrderByDescending (s => s.Length).First ();
var strings = new string[] { "1", "02", "003", "0004", "00005" };

string longest = strings.OrderByDescending( s => s.Length ).First();
产量:00005

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

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


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

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

string[] arr = new string[] { "a", "aa", "aaa" };
var longest = arr.Max(w => w.Length)
聚合语法比其他方法更难阅读,但严格来说,它比我在这里看到的其他方法更有效,因为它不需要排序。只是一个O(N)实现

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


编辑(2.5年后):空合并优于三元空检查。

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

太好了!谢谢,我使用了FirstOrDefault()。它看起来确实更简洁,但在性能方面有什么优势吗?@vrrathod没有性能提升,它仍然在执行与您相同的迭代逻辑,它只是一个更简洁的语法,这就是LINQ的全部内容。它确实做了同样的事情。以下是我的测试方法。我生成了一个包含5000个字符串的数组。LINQ在我的机器上占用大约15个cpu周期。我写了一个比较字符串长度的老式循环。它以0个刻度返回。我想差别是用来分类的。这确实有效。但是它是O(N^2),所以它比另一个答案需要更长的时间。例如,5000字符串数组
strings.OrderByDescending(s=>s.Length.First()将在我的机器上大约15个CPU周期后返回,而这将需要大约390个CPU周期。滴答声。是的,我意识到这一点。我之所以提出这个问题,是因为它说明了它在做什么,而不是使用排序的副作用。它可以找到最大长度,但不能找到字符串本身。更正:这个问题要求的是一个字符串,而不是最长字符串的列表。此外,您的代码在编译最后一个分号之前需要一个“.ToArray()”。但是我推荐您提供的代码可以很容易地用于提供最长单词的列表,或者仅提供第一个单词,在代码末尾使用简单的“.FirstOrDefault()”vs.ToArray()”。就我个人而言,我更喜欢这个解决方案的灵活性,所以我最喜欢你的解决方案所提供的。谢谢我更喜欢这个答案,因为它确实回答了所问的问题,而且我相信当不需要一个最长单词的完整列表时,对于单个项目的答案来说,它是最有效的,并且通过额外的编辑,Caleb提到了处理空字符串。我竖起两个大拇指!为了方便起见:下面是我测试过的代码,效果很好:`string longest=strings.Aggregate(string.Empty,(seed,f)=>(f==null?0:f.Length)>seed.Length?f:seed);'
int maxLength = collection.Max(x => x.Length);
string[] longestStrings = collection.Where(x => x.Length == maxLength).ToArray();