عند استخدام طريقة التمديد مع امدا على LINQtoObjects إلى تصفية مجموعة ؟

StackOverflow https://stackoverflow.com/questions/5194

  •  08-06-2019
  •  | 
  •  

سؤال

أنا ببعض النماذج C# 3 مجموعة فلاتر وجاء عبر هذا.لدي مجموعة من المنتجات:

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

السؤال: ما هو الفرق و لماذا استخدام واحد على الآخر ؟

هل كانت مفيدة؟

المحلول

LINQ يتحول إلى أسلوب المكالمات مثل قانون لديك.

وبعبارة أخرى ، ينبغي أن يكون هناك أي فرق.

ومع ذلك ، في قطعتين من التعليمات البرمجية أنت لا تدعو .ToList في الأولى, أول قطعة من التعليمات البرمجية سوف تنتج enumerable مصدر البيانات, ولكن إذا كنت استدعاء .ToList على ذلك ، ينبغي أن يكون الاثنان نفس.

نصائح أخرى

كما ذكر د سوف يكون IEnumerable<MyProduct> في حين f List<MyProduct>

يتم التحويل من C# مترجم

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

يتم تحويلها إلى (قبل تجميع IL مع الأدوية الموسعة):

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

علما أنه في هذه الحالة بسيطة يجعل الفارق ضئيل.حيث Linq يصبح قيمة حقا هو أكثر تعقيدا بكثير الحلقات.

فعلى سبيل المثال هذا البيان يمكن أن تشمل مجموعة سطحها, أوامر قليلة السماح البيانات تكون لا تزال قابلة للقراءة في Linq الشكل عندما تعادل .Method().Method.Method() سوف تتعقد.

بخلاف ToList الفرق, #2 هو الكثير أكثر قابلية للقراءة الطبيعية المنظمة البحرية الدولية

جملة تستخدمه d سوف تحصل على تحويلها من قبل المترجم في نفس IL كما طرق الإرشاد.إن "مثل SQL" جملة من المفترض أن تكون طريقة أكثر طبيعية تمثل LINQ التعبير (على الرغم من أنني شخصيا أفضل طرق الإرشاد).كما سبق أن أشار إلى المثال الأول سوف يعود IEnumerable النتيجة حين المثال الثاني سيعود قائمة نتيجة بسبب الدعوة إلى ToList().إذا قمت بإزالة ToList() الدعوة في المثال الثاني ، سوف تعود إلى نفس النتيجة حيث بإرجاع IEnumerable النتيجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top