Việc thực hiện All
theo ILSpy (như tôi thực sự đã đi và xem, thay vì "tốt, phương pháp đó hoạt động hơi giống ..." Tôi có thể làm nếu chúng ta đang thảo luận về lý thuyết chứ không phải là tác động).
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource current in source)
{
if (!predicate(current))
{
return false;
}
}
return true;
}
Thực hiện Any
theo ILSpy:
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource current in source)
{
if (predicate(current))
{
return true;
}
}
return false;
}
Tất nhiên, có thể có một số khác biệt tinh tế trong IL được sản xuất. Nhưng không, không có. IL khá giống nhau nhưng đối với sự đảo ngược rõ ràng là trả về true trên kết hợp vị ngữ so với trả về false trên không khớp vị ngữ.
Tất nhiên đây chỉ là linq-for-object. Có thể một số nhà cung cấp linq khác đối xử với một nhà cung cấp tốt hơn nhiều so với nhà cung cấp khác, nhưng nếu đó là trường hợp, thì khá ngẫu nhiên khi một nhà cung cấp triển khai tối ưu hơn.
Dường như quy tắc chỉ xuất phát từ một người nào đó cảm thấy if(determineSomethingTrue)
đơn giản và dễ đọc hơn if(!determineSomethingFalse)
. Và công bằng mà nói, tôi nghĩ rằng họ có một điểm mà tôi thường thấy if(!someTest)
khó hiểu * khi có một bài kiểm tra thay thế về tính dài dòng và độ phức tạp tương đương sẽ trở thành sự thật cho điều kiện chúng ta muốn hành động. Tuy nhiên, thực sự, cá nhân tôi thấy không có gì có lợi cho người khác trong hai lựa chọn thay thế mà bạn đưa ra, và có lẽ sẽ hơi nghiêng về phía trước nếu vị ngữ phức tạp hơn.
* Không khó hiểu như tôi không hiểu, nhưng khó hiểu vì tôi lo lắng rằng có một số lý do tinh tế cho quyết định mà tôi không hiểu, và phải mất một vài bước tinh thần để nhận ra rằng "không, họ chỉ quyết định làm Theo cách đó, đợi xem tôi đã xem lại đoạn mã này để làm gì nữa? ... "