我可以在lambda表达式中调用函数吗?

7 c# lambda

我想做以下但我认为这不会起作用:

.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;
        }
Run Code Online (Sandbox Code Playgroud)

一个.这有用吗?湾 如果没有,我是否需要查询故事,然后按分数对它们进行排序?

Mar*_*ell 5

是的,如果序列是一系列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;
    }
}
Run Code Online (Sandbox Code Playgroud)

添加一个this(即Score(this Story s)),您可以使用:

.OrderByDescending(s=>s.Score())
Run Code Online (Sandbox Code Playgroud)