संग्रह को फ़िल्टर करने के लिए LINQtoObjects पर लैम्ब्डा के साथ एक एक्सटेंशन विधि का उपयोग कब करें?

मैं कुछ सी # 3 संग्रह फिल्टर प्रोटोटाइप कर रहा हूं और इस पर आया हूं। मेरे पास उत्पादों का संग्रह है:

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

var MyProducts = new  List
{            
    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();

Question: What is the difference, and why use one over the other?

0
ro fr bn

4 उत्तर

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

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

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

0
जोड़ा

ToList अंतर के अलावा, # 2 बहुत अधिक पठनीय और प्राकृतिक आईएमओ है

0
जोड़ा

As mentioned d will be IEnumerable while f is List

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

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

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

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

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

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

0
जोड़ा

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

0
जोड़ा