วิธีใด "ดีที่สุด" (โดยคำนึงถึงความเร็วและความสามารถในการอ่าน) ในการพิจารณาว่ารายการว่างหรือไม่ แม้ว่ารายการจะเป็นประเภทIEnumerable<T>
และไม่มีคุณสมบัติ Count ก็ตาม
ตอนนี้ฉันกำลังโยนระหว่างสิ่งนี้:
if (myList.Count() == 0) { ... }
และนี่:
if (!myList.Any()) { ... }
ฉันเดาว่าตัวเลือกที่สองเร็วกว่าเนื่องจากจะกลับมาพร้อมผลลัพธ์ทันทีที่เห็นรายการแรกในขณะที่ตัวเลือกที่สอง (สำหรับ IEnumerable) จะต้องไปที่ทุกรายการเพื่อส่งคืนการนับ
ดังที่กล่าวไว้ตัวเลือกที่สองดูเหมือนว่าคุณสามารถอ่านได้หรือไม่? คุณต้องการอะไร หรือคุณสามารถคิดวิธีที่ดีกว่าในการทดสอบรายการว่างได้หรือไม่?
การตอบสนองของEdit @ lassevk ดูเหมือนจะมีเหตุผลมากที่สุดควบคู่ไปกับการตรวจสอบรันไทม์เล็กน้อยเพื่อใช้การนับแคชหากเป็นไปได้ดังนี้:
public static bool IsEmpty<T>(this IEnumerable<T> list)
{
if (list is ICollection<T>) return ((ICollection<T>)list).Count == 0;
return !list.Any();
}
list.Any()
เทียบเท่ากับlist.IsEmpty
? วิธีการเฟรมเวิร์กควรได้รับการปรับให้เหมาะสม - ควรเขียนใหม่ก็ต่อเมื่อคุณคิดว่ามันเป็นคอขวดที่สมบูรณ์แบบ
IsEmpty
วิธีการขยาย github.com/dotnet/corefx/issues/35054 โปรดตรวจสอบและลงคะแนนหากคุณชอบและเห็นด้วย
is
และcast
แต่การใช้as
และการnull
ตรวจสอบ:ICollection<T> collection = list as ICollection<T>; if (collection != null) return colllection.Count;