【问题标题】:how to find the longest string in a string[] using LINQ如何使用 LINQ 在字符串 [] 中找到最长的字符串
【发布时间】:2011-06-29 16:55:56
【问题描述】:

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

【问题讨论】:

    标签: c# linq-to-objects


    【解决方案1】:

    它不会更有效率,但是这样做会更干净一些:

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

    输出:00005

    【讨论】:

    • 太棒了!谢谢,我使用了 FirstOrDefault()。它确实看起来更干净,但在性能方面有什么优势吗?
    • @vrrathod 没有性能提升,它仍然在执行与您相同的迭代逻辑,只是语法更简洁,这就是 LINQ 的全部意义。
    • 它确实做同样的事情。这是我的测试方法。我生成了一个包含 5000 个字符串的数组。 LINQ 在我的机器上需要大约 15 个 cpu 滴答声。我写了一个比较字符串长度的老式循环。它在 0 滴答声中返回。我猜的差异是为了排序。
    【解决方案2】:
    strings.Aggregate(string.Empty, (seed, f) => f?.Length ?? 0 > seed.Length ? f : seed);
    

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

    编辑:此方法以及此处的大多数其他方法都假定您的列表中没有空值,以免 f.Length 引发空引用异常。一个快速的三元运算符 (f != null ? f.Length : 0) 会解决这个问题,如果它对您的可枚举有效。

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

    【讨论】:

    • 我更喜欢这个答案,因为它确实回答了所提出的问题并且我相信当不需要最长单词的整个列表时,它对于单个项目的答案是最有效的 加上额外的编辑,Caleb 也提到了处理空字符串。我竖起两个大拇指!为方便起见:这是我测试过的运行良好的代码:`string long = strings.Aggregate(string.Empty, (seed, f) => (f == null ? 0 : f.Length) > seed.Length ? f :种子);'
    【解决方案3】:
    string [] strings;
    return strings.OrderByDescending (s => s.Length).First ();
    

    【讨论】:

      【解决方案4】:
      string[] arr = new string[] { "a", "aa", "aaa" };
      
      var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First();
      

      输出aaa

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

      【讨论】:

      • 这确实有效。但是它的O(N ^ 2),所以它比其他答案需要更长的时间。对于前。在 5000 字符串数组上 strings.OrderByDescending( s => s.Length ).First(); 将在我的机器上返回大约 15 个 CPU 滴答声,而这大约需要 390 个滴答声。
      • 是的,我意识到了这一点。我提出它是因为它说明了它在做什么,而不是使用排序的副作用。
      【解决方案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 中)和 ??运算符来检查您的集合是否可以包含这些空值。

      【讨论】:

      • 更正:问题要求一个字符串而不是最长字符串的列表。您的代码在最后一个分号之前还需要一个 `.ToArray()' 才能编译。但我确实赞扬您提供的代码可以轻松用于提供最长单词列表或仅提供第一个单词,在代码末尾使用简单的 '.FirstOrDefault()' vs '.ToArray()' .我个人更喜欢这个解决方案的灵活性,所以我最喜欢你的解决方案提供的东西。谢谢!
      【解决方案6】:

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

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

      【讨论】:

      • 这会找到最大的长度,但不是字符串本身。
      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多