【问题标题】:Can I call a function in a lambda expression?我可以在 lambda 表达式中调用函数吗?
【发布时间】:2009-01-14 07:02:46
【问题描述】:

我想执行以下操作,但我认为这行不通:

.OrderByDescending(s => Score(s)), ...


private double Score(Story s)
        {
            DateTime now = DateTime.Now;
            TimeSpan elapsed = now.Subtract(s.PostedOn);
            double daysAgo = elapsed.TotalDays;

            return s.Votes.Count + s.Comments.Count - daysAgo;
        }

一个。这应该工作吗? 湾。如果没有,我需要查询故事然后按分数排序吗?

【问题讨论】:

  • 这是 LINQ-to-Objects 吗?还是 LINQ-to-SQL?英孚?它有所作为。

标签: c# lambda


【解决方案1】:

是的,如果序列是Story 项的序列,那应该可以工作;你有什么问题?请注意,如果 Score 不适用于任何实例,则可能值得将其设为静态。

另一种选择是让 Score() 方法成为 Story 上的实例方法或扩展方法。

请注意,这只适用于 LINQ-to-Objects;如果您使用的是 LINQ-to-SQL / LINQ-to-Entities 等,您要么需要对整个事物使用 lambda,要么(仅在 LINQ-to-SQL 中)使用 UDF 映射函数(在数据上- context) 来计算值。

使用原始语法的示例(LINQ-to-Objects):

using System.Linq;
using System;
class Story { // declare type
    public DateTime PostedOn { get; set; }
    // simplified purely for convenience
    public int VotesCount { get; set; }
    public int CommentsCount { get; set; }
}
static class Program {
    static void Main() {
        // dummy data
        var data = new[] {
            new Story { PostedOn = DateTime.Today,
                VotesCount = 1, CommentsCount = 2},
            new Story { PostedOn = DateTime.Today.AddDays(-1),
                VotesCount = 5, CommentsCount = 22},
            new Story { PostedOn = DateTime.Today.AddDays(-2),
                VotesCount = 2, CommentsCount = 0}
        };
        var ordered = data.OrderByDescending(s=>Score(s));
        foreach (var row in ordered)
        {
            Console.WriteLine(row.PostedOn);
        }
    }

    private static double Score(Story s) {
        DateTime now = DateTime.Now;
        TimeSpan elapsed = now.Subtract(s.PostedOn);
        double daysAgo = elapsed.TotalDays;
        // simplified purely for convenience
        return s.VotesCount + s.CommentsCount - daysAgo;
    }
}

添加this(即Score(this Story s)),即可使用:

.OrderByDescending(s=>s.Score())

【讨论】:

    【解决方案2】:

    在小笔记中,你可以写

    .OrderByDescending(Score)
    

    因为“Score”的签名符合要求的签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 2011-04-21
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多