2009-01-14 8 views
6

मैं निम्नलिखित लेकिन मुझे नहीं लगता है कि यह काम करेगा करना चाहते हैं:क्या मैं लैम्ब्डा अभिव्यक्ति में एक फ़ंक्शन कॉल कर सकता हूं?

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

एक। क्या यह काम करना चाहिए? बी। यदि नहीं, तो क्या मुझे कहानियों के लिए पूछताछ करने की आवश्यकता है और फिर स्कोर द्वारा क्रमबद्ध करें?

+0

यह LINQ-to-Objects? या LINQ-to-SQL? एफई? यह एक फर्क पड़ता है। –

उत्तर

4

हां, अगर यह अनुक्रम Story आइटमों का अनुक्रम है तो काम करना चाहिए; आपकी क्या समस्या हैं? ध्यान दें कि यदि Score किसी भी उदाहरण पर लागू नहीं होता है, तो यह स्थिर बना सकता है।

दूसरा विकल्प स्कोर() विधि को Story, या एक एक्सटेंशन विधि पर एक उदाहरण विधि बनाना है।

ध्यान दें कि यह केवल LINQ-to-Objects पर लागू होता है; यदि आप LINQ-to-SQL/LINQ-to-Entities, आदि का उपयोग कर रहे हैं, तो आपको या तो पूरी चीज़ के लिए लैम्ब्डा का उपयोग करने की आवश्यकता है, या (केवल LINQ-to-SQL में) एक यूडीएफ-मैप किए गए फ़ंक्शन का उपयोग करें (डेटा- संदर्भ) मूल्य की गणना करने के लिए।

उदाहरण (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()) 
2

एक छोटी सी टिप्पणी पर, आप लिख सकते हैं

.OrderByDescending(Score) 

"स्कोर" हस्ताक्षर आवश्यक हस्ताक्षर को पूरा करता है।

संबंधित मुद्दे

 संबंधित मुद्दे