ขึ้นอยู่กับว่าคุณชอบไวยากรณ์แบบสอบถาม linq มากแค่ไหนคุณสามารถใช้วิธีการขยายได้โดยตรงเช่น:
var item = Items.First(i => i.Id == 123);
และถ้าคุณไม่ต้องการให้เกิดข้อผิดพลาดหากรายการว่างเปล่าให้ใช้FirstOrDefaultซึ่งส่งคืนค่าเริ่มต้นสำหรับประเภทองค์ประกอบ ( nullสำหรับประเภทการอ้างอิง):
var item = Items.FirstOrDefault(i => i.Id == 123);
if (item != null)
{
// found it
}
Single()และSingleOrDefault()ยังสามารถใช้งานได้ แต่ถ้าคุณกำลังอ่านจากฐานข้อมูลหรือสิ่งที่รับประกันความเป็นเอกลักษณ์อยู่แล้วฉันจะไม่รำคาญเพราะต้องสแกนรายการเพื่อดูว่ามีรายการที่ซ้ำกันหรือไม่ First()และFirstOrDefault()หยุดในนัดแรกดังนั้นพวกเขาจึงมีประสิทธิภาพมากขึ้น
ของครอบครัวFirst()และSingle()ครอบครัวนี่คือที่ที่พวกเขาโยน:
First() - โยนถ้าว่าง / ไม่พบไม่โยนถ้าซ้ำกัน
FirstOrDefault() - ส่งคืนค่าเริ่มต้นหากว่างเปล่า / ไม่พบไม่โยนหากซ้ำกัน
Single() - พ่นหากว่างเปล่า / ไม่พบพ่นหากมีรายการซ้ำ
SingleOrDefault() - ส่งคืนค่าเริ่มต้นหากว่างเปล่า / ไม่พบพ่นหากมีรายการซ้ำ
Single()และSingleOrDefault()ถ้าฉันรู้ว่าข้อมูลนั้นไม่ซ้ำกันอยู่แล้ว (เช่นจากฐานข้อมูลที่มีข้อ จำกัด เป็นต้น) เนื่องจากSingle()บังคับให้สแกนส่วนที่เหลือของรายการเพื่อค้นหารายการที่ซ้ำกันได้ แต่นั่นคือฉัน หากคุณจำเป็นต้องบังคับใช้ความเป็นเอกลักษณ์ ณ จุดนี้ให้ใช้Single()ครอบครัวถ้าไม่ใช้First()ครอบครัว