簡體   English   中英

我可以在lambda表達式中調用函數嗎?

[英]Can I call a function in a lambda expression?

我想做以下但我認為這不會起作用:

.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;
        }

一種。 這有用嗎? 如果沒有,我是否需要查詢故事,然后按分數對它們進行排序?

是的,如果序列是一系列Story項,那么它應該有效; 你有什么問題? 請注意,如果Score不適用於任何實例,則可能值得將其設置為靜態。

另一種選擇是使Score()方法成為Story或擴展方法的實例方法。

請注意,這僅適用於LINQ到對象; 如果您正在使用LINQ-to-SQL / LINQ-to-Entities等,您需要使用lambda來完成整個事務,或者(僅在LINQ-to-SQL中)使用UDF映射函數(在數據上) context)來計算價值。

使用原始語法的示例(LINQ到對象):

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())

在一個小調,您可以寫

.OrderByDescending(Score)

因為“得分”的簽名符合要求的簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM