是否有LINQ函数用于获取字符串列表中最长的字符串?

use*_*677 35 c# linq string

是否有一个LINQ功能,或者必须自己编码,如下所示:

static string GetLongestStringInList()
{
    string longest = list[0];

    foreach (string s in list)
    {
        if (s.Length > longest.Length)
        {
            longest = s;
        }
    }

    return longest;
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*onC 87

这只需要一次循环迭代:

list.Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是迄今为止最快的答案.我为100万个字符串写了一个小测试,每个字符串在1-2000个字符之间.@ Dani的答案速度为"3.26秒",答案为"0.36秒".这是每种方法平均15次运行.我忘记了聚合扩展方法的一切!:) (4认同)
  • 它在其他语言中也称为 `reduce` 或 `fold` (http://en.wikipedia.org/wiki/Fold_(higher-order_function)) (2认同)
  • 使用OrderBy的所有答案都在执行排序,O(nlogn)操作.查找序列中的最大条目应该是O(n)操作. (2认同)
  • 壮观!但是我们真的需要空字符串作为起始值吗?这也有效: varlongest = list.Aggregate((max, cur) => max.Length > cur.Length ? max : cur); (2认同)

Dan*_*ani 28

你可以用这个: list.OrderByDescending(s => s.Length).First();

  • 如果我们要谈论性能,这种技术的真正性能损失是列表正在排序.我认为一旦搜索运行(即调用`First()`时,你最终会支付O(nlgn)).另一方面,SimonC的解决方案是O(n). (6认同)
  • @Suhas我没有听到任何表演,所以我不会对此发表评论.至于使用它 - 它将取决于它的使用环境.如果你在`string [] list = new string [0]上调用`First`;`linq将抛出一个异常,其中`FirstOrDefault`将返回null而不抛出异常.我通常发现自己使用`FirstOrDefault`并在通话后的某个时间检查结果.如果您处于可以保证列表*总是*至少有一个项目的情况下,`First`就可以,但如果您有疑问(比如选择XML中的属性),那么我使用`FirstOrDefault`. (3认同)
  • 如果数组为空,您甚至可以使用`FirstOrDefault`来避免错误. (2认同)
  • @Joshua:嗯,他的代码中存在完全相同的问题. (2认同)
  • @Suhas:性能开销是多少?一个`if`? (2认同)

jav*_*iry 7

var list = new List<string>(); // or string[] or any

list.Add("a");
list.Add("ccc");
list.Add("bb");
list.Add("eeeee");
list.Add("dddd");

// max-length
var length = list.Max(s => s.Length);

// biggest one
var biggest = list.FirstOrDefault(s => s.Length == length);

// if there is more that one by equal length
var biggestList = list.Where(s => s.Length == length);

// by ordering list
var biggest = list.OrderByDescending(s => s.Length).FirstOrDefault();

// biggest-list by LINQ
var bigList2 = from s in list where s.Length == list.Max(a => a.Length) select s;

// biggest by LINQ
var biggest2 = bigList2.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)