c# - شرح - linq tutorial




متى يتم استخدام.First ومتى يجب استخدام.FirstOrDefault مع LINQ؟ (10)

لقد بحثت في جميع أنحاء ولم أجد بالفعل إجابة واضحة حول متى تريد استخدام .First ومتى تريد استخدام .FirstOrDefault مع LINQ.

  • متى تريد استخدام .First ؟ فقط عندما تريد التقاط الاستثناء في حالة عدم وجود نتائج حيث تم إرجاعها؟

    var result = List.Where(x => x == "foo").First();
    
  • متى تريد استخدام .FirstOrDefault ؟ عندما تريد دائما النوع الافتراضي إذا لم يكن هناك نتيجة؟

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • ولهذه المسألة ، ماذا عن خذ؟

    var result = List.Where(x => x == "foo").Take(1);
    

linq العديد من الطرق لتنفيذ استعلام واحد بسيط على مجموعات ، فقط نكتب الصلات في SQL ، يمكن تطبيق مرشح الأول أو الأخير تبعا للحاجة والضرورة.

في ما يلي مثال يمكننا من خلاله العثور على عنصر له معرف في مجموعة. لإضافة المزيد على هذا ، FirstOrDefault الأساليب First ، FirstOrDefault ، بشكل مثالي نفس عندما تحتوي مجموعة على سجل واحد على الأقل. ومع ذلك ، إذا كان من الأفضل أن تكون المجموعة فارغة. سيتم First إرجاع استثناء ولكن FirstOrDefault null أو افتراضي. على سبيل المثال ، سيتم إرجاع int 0. لذلك ، على الرغم من أن استخدام مثل هذا هو تفضيل شخصي ، إلا أنه من الأفضل استخدام FirstOrDefault لتجنب الاستثناء.


أود أن استخدم First() عندما أعرف أو أتوقع أن يحتوي التسلسل على عنصر واحد على الأقل. بمعنى آخر ، عندما يكون التتابع غير عادي ، يكون التسلسل فارغًا.

استخدم FirstOrDefault() عندما تعرف أنك ستحتاج إلى التحقق مما إذا كان هناك عنصر أم لا. بعبارة أخرى ، عندما يكون التشريع فارغًا. يجب عدم الاعتماد على معالجة الاستثناء للشيك. (إنها ممارسة سيئة وقد تؤذي الأداء).

وأخيراً ، يكون الفرق بين First() و Take() هو أن First() بإرجاع العنصر نفسه ، بينما تقوم Take() بإرجاع سلسلة من العناصر التي تحتوي على عنصر واحد بالضبط. (إذا قمت بتمرير 1 كمعامل).


بادئ ذي بدء ، Take هي طريقة مختلفة تماما. تقوم بإرجاع IEnumerable<T> وليس T واحد ، لذلك خارجاً.

بين First و FirstOrDefault ، يجب عليك استخدام First عندما تكون متأكدًا من وجود عنصر وإذا لم يكن موجودًا ، فهناك خطأ.

بالمناسبة ، إذا كان التسلسل الخاص بك يحتوي على عناصر default(T) (على سبيل المثال ، null ) وتحتاج إلى التمييز بين أن تكون فارغة والعنصر الأول null ، فلا يمكنك استخدام FirstOrDefault .


حسناً ، دعيني أعطي سنتي أول / Firstordefault هي عند استخدامك منشئ الثاني. لن أقوم بشرح ما هو موجود ، ولكن عندما تستخدم دائمًا واحدة لأنك لا تريد التسبب في استثناء.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));

لقد عثرت على موقع ويب يقوم بعمليات البحث لشرح الحاجة إلى FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
إذا لم تكن هناك نتائج لاستعلام ، وتريد الاتصال بـ First () أو Single () للحصول على صف واحد ... ستحصل على استثناء "Sequence contains no elements".

إخلاء المسؤولية: لم أستخدم أبداً LINQ ، لذا أعتذر إذا كان هذا بعيداً عن العلامة.



ينتمي هذا النوع من الدالة إلى عوامل العناصر. يتم تعريف بعض مشغلي العناصر المفيدة أدناه.

  1. أولا / FirstOrDefault
  2. آخر / LastOrDefault
  3. واحد / SingleOrDefault

نستخدم عوامل العناصر عندما نحتاج إلى اختيار عنصر واحد من تسلسل يستند إلى شرط معين. هنا هو المثال.

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10};

يعيد عامل التشغيل الأول () العنصر الأول من التسلسل بعد استيفاء الشرط. إذا لم يتم العثور على أي عنصر ، فسيتم ذلك من خلال استثناء.

int int = items.Where (item => item == 2) .First ()؛

إرجاع عامل FirstOrDefault () العنصر الأول في تسلسل بعد استيفاء الشرط. إذا لم يتم العثور على أي عنصر ، فسيعرض قيمة افتراضية من هذا النوع.

int result1 = items.Where (item => item == 2) .FirstOrDefault ()؛


.First سوف يرمي استثناء عند عدم وجود نتائج. لن يؤدي .FirstOrDefault إلى إرجاع أي (أنواع مرجعية) فارغة أو القيمة الافتراضية لنوع القيمة. (على سبيل المثال ، مثل 0 لـ int.) السؤال هنا ليس عندما تريد النوع الافتراضي ، ولكن المزيد: هل أنت على استعداد للتعامل مع استثناء أو التعامل مع قيمة افتراضية؟ نظرًا لأن الاستثناءات يجب أن تكون استثنائية ، يُفضل FirstOrDefault عندما تكون غير متأكد من أنك ستحصل على نتائج من استفسارك. عندما تكون هناك منطقية البيانات ، يمكن اعتبار معالجة الاستثناءات.

Skip() و Take() عادةً عند إعداد ترحيل الصفحات في النتائج. (مثل عرض النتائج العشرة الأولى ، والنتائج العشرة التالية في الصفحة التالية ، إلخ.)

أتمنى أن يساعدك هذا.


أول()

عندما تعرف أن النتيجة تحتوي على أكثر من عنصر واحد متوقع ويجب عليك فقط أول عنصر في التسلسل.

FirstOrDefault ()

يكون FirstOrDefault () مثل First () باستثناء أنه إذا لم يتطابق أي عنصر مع الشرط المحدد منه ، فإنه يعيد القيمة الافتراضية للنوع الأساسي لمجموعة عامة. لا يؤدي إلى إلغاء InvalidOperationException إذا تم العثور على أي عنصر. لكن جمع عنصر أو تسلسل هو فارغ من يلقي استثناء.


someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

أي واحد لاستخدام؟ يجب أن يتم تحديده من خلال منطق الأعمال ، وليس الخوف من الاستثناء / فشل البرنامج.

على سبيل المثال ، إذا كان منطق الأعمال يقول أنه لا يمكن أن يكون لدينا صفقات في أي يوم عمل (فقط افترض). ثم يجب أن لا تحاول التعامل مع هذا السيناريو مع بعض البرمجة الذكية. سأستخدم دومًا First () على هذه المجموعة ، ودع البرنامج يفشل إذا كان هناك شيء آخر يفسد منطق الأعمال.

الشفرة:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

أود أن أرى تعليقات الآخرين حول هذا الموضوع.





linq