【问题标题】:SubQuery using Lambda Expression使用 Lambda 表达式的子查询
【发布时间】:2014-07-11 07:23:55
【问题描述】:

我正在使用 LINQ 子查询来获取数组中所有最小长度的单词。 我想使用 Lambda 表达式。

var names = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" }.AsQueryable();
(
from n in names
where n.Length == names.Min (n2 => n2.Length)
select n
)

输出: 汤姆,杰

谢谢, 普拉哈尔

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    这可行:

    var minNames = names.Where(s => s.Length == names.Min(n=>n.Length));
    

    但它会评估列表中每个名称的最小长度(O(n*n) 复杂度),因此这样会更好:

    var min = names.Min(s => s.Length); //calc. this only once
    var minNames = names.Where(s => s.Length == min);
    

    【讨论】:

    • 赞成。请参阅有趣的链接线程,该线程确认每次都调用 Min 方法,就像您说的那样导致 O(n**2) 复杂性。解决此问题的另一种方法是int min = int.MaxValue; var minNames = names.OrderBy(s => s.Length).TakeWhile(s => min >= (min = s.Length)),但这并不比您的解决方案好。
    【解决方案2】:

    这个问题对我来说似乎有点模糊,但这就是你要找的吗?

     names.Where (x => x.Length == names.Min (n2 => n2.Length));
    

    【讨论】:

      【解决方案3】:

      这应该对你有帮助:

          var minNames = names.Where(c => c.Length == names.Min(n => n.Length))
                  .ToArray();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多