2008-08-07 12 views
11

मैं कुछ सी # 3 संग्रह फ़िल्टर प्रोटोटाइप कर रहा हूं और इस पर आया हूं। मैं उत्पादों की एक संग्रह है:संग्रह को फ़िल्टर करने के लिए LINQtoObjects पर लैम्ब्डा के साथ एक एक्सटेंशन विधि का उपयोग कब करें?

public class MyProduct 
{ 
    public string Name { get; set; } 
    public Double Price { get; set; } 
    public string Description { get; set; } 
} 

var MyProducts = new List<MyProduct> 
{    
    new MyProduct 
    { 
     Name = "Surfboard", 
     Price = 144.99, 
     Description = "Most important thing you will ever own." 
    }, 
    new MyProduct 
    { 
     Name = "Leash", 
     Price = 29.28, 
     Description = "Keep important things close to you." 
    } 
    , 
    new MyProduct 
    { 
     Name = "Sun Screen", 
     Price = 15.88, 
     Description = "1000 SPF! Who Could ask for more?" 
    } 
}; 

अब अगर मैं LINQ यह उम्मीद के रूप में काम करता है फिल्टर करने के लिए उपयोग करें:

var d = (from mp in MyProducts 
      where mp.Price < 50d 
      select mp); 

और अगर मैं एक लैम्ब्डा के साथ संयुक्त कहाँ विस्तार विधि का उपयोग फिल्टर के रूप में काम करता है अच्छी तरह से:

var f = MyProducts.Where(mp => mp.Price < 50d).ToList(); 

प्रश्न: क्या अंतर है, और क्यों एक दूसरे के ऊपर का उपयोग करें?

उत्तर

5

LINQ आपके पास मौजूद कोड की तरह विधि कॉल में बदल जाता है।

दूसरे शब्दों में, कोई अंतर नहीं होना चाहिए।

हालांकि, कोड के आपके दो टुकड़ों में आप कॉल नहीं कर रहे हैं। पहले सूची में, इसलिए कोड का पहला भाग एक समेकित डेटा स्रोत उत्पन्न करेगा, लेकिन यदि आप कॉल करते हैं। इस पर लिस्ट करें, दोनों एक जैसा होना चाहिए ।

0

ToList अंतर के अलावा, # 2 एक बहुत अधिक पठनीय और IMO

4

स्वाभाविक है जैसा कि बताया जा घ IEnumerable<MyProduct> होगी, जबकि च List<MyProduct>

रूपांतरण सी # संकलक द्वारा किया जाता है है

var d = 
    from mp in MyProducts 
    where mp.Price < 50d 
    select mp; 

को परिवर्तित किया गया है (आईएल के संकलन से पहले और जेनेरिक के साथ विस्तारित):

var d = 
    MyProducts. 
    Where<MyProduct>(mp => mp.Price < 50d). 
    Select<MyProduct>(mp => mp); 
    //note that this last select is optimised out if it makes no change 

ध्यान दें कि इस साधारण मामले में यह थोड़ा अंतर बनाता है। जहां लिंक वास्तव में मूल्यवान हो जाता है, वह अधिक जटिल लूप में होता है।

उदाहरण के लिए इस कथन में समूह-दर, आदेश और कुछ बयान शामिल हो सकते हैं और अभी भी लिंक प्रारूप में पठनीय हो सकते हैं जब समकक्ष .Method().Method.Method() जटिल हो जाएगा।

0

डी के लिए आप जिस वाक्यविन्यास का उपयोग कर रहे हैं, वह संकलन द्वारा उसी आईएल में विस्तार विधियों के रूप में परिवर्तित हो जाएगा। "SQL-like" वाक्यविन्यास को LINQ अभिव्यक्ति का प्रतिनिधित्व करने का एक अधिक प्राकृतिक तरीका माना जाता है (हालांकि मैं व्यक्तिगत रूप से एक्सटेंशन विधियों को प्राथमिकता देता हूं)। जैसा कि पहले से ही इंगित किया गया है, पहला उदाहरण एक आईनेमरेबल परिणाम लौटाएगा जबकि दूसरा उदाहरण कॉललिस्ट टू कॉल() के कारण सूची परिणाम लौटाएगा। यदि आप दूसरे उदाहरण में ToList() कॉल को हटाते हैं, तो वे दोनों एक ही परिणाम लौटाएंगे जहां एक IENumerable परिणाम कहां देता है।

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

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