SORU
27 Ocak 2012, Cuma


SERİ: Herhangi bir vs Tüm Don't

Genellikle taktirde bir değer listede (doğrularken gibi) eşleşip eşleşmediğini kontrol etmek istiyorum:

if (!acceptedValues.Any(v => v == someValue))
{
    // exception logic
}

Son zamanlarda, ReSharper bana bu sorguları basitleştirmek için soruyorum fark ettim:

if (acceptedValues.All(v => v != someValue))
{
    // exception logic
}

Belli ki, bu mantıksal olarak aynı, belki biraz daha okunabilir eğer matematiğin çok şey yaptın (varsa), benim sorum: bu bir performans isabet neden?

Olması gerektiği gibi hissettiriyor (6* yani *sesler .All() değil gibi geliyor ise kısa devre gibi), ama bunu kanıtlayacak hiçbir şeyim yok. Herkes sorgular aynı giderecek olup olmadığını, ya da ReSharper yoldan bana öncü olup olmadığı konusunda derin bilgisi olan var mı?

CEVAP
27 Ocak 2012, Cuma


Uygulama All göre İLSpy (aslında ben gidip baktım, yerine "evet, bu yöntem işe bir bit gibi ..." belki giderim eğer meselelerini teorisi yerine etkisi).

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;
}

Any uygulanması İLSpy göre:

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;
}

Elbette, IL bazı ince fark üretilmiş olabilir. Ama hayır, hayır, efendim. IL yüklem uyumsuzluğu, yanlış dönen karşı oldukça fazla ama yüklem doğru dönen bariz Çevirme için aynı maç.

Bu sadece tabii etmeniz için nesneler. Bazı diğer seri sağlayıcısı diğerine göre çok daha iyi bir muamele, ama eğer böyle bir durum olsaydı, daha iyi bir uygulama var oldukça rastgele bir şey olabilir.

Bu kural sadece biri if(determineSomethingTrue) basit ve if(!determineSomethingFalse) daha okunabilir olduğunu hissediyorum aşağı gelir gibi görünüyor. Ve adalet, bence onlar biraz bir noktada ben genellikle if(!someTest) karışık* ne zaman bir alternatif test eşit ayrıntı ve karmaşıklık bu dönüş gerçek koşulu istediğimiz için hareket. Henüz gerçekten, ben şahsen verdiğiniz iki alternatiften bir iyilik için bir şey bulmak, ve belki de eğer yüklem daha karmaşık olsaydı çok hafif eski doğru eğil.

*Kafa karıştırıcı olarak anlamıyorum, ama kafa karıştırıcı olarak beni endişelendiren bir ince sebeple karar olduğunu anlamıyorum, ve bir kaç akıl atlar için fark bu "hayır, onlar sadece yapmaya karar verdi bu şekilde, ne olduğunu ben bakıyorum bu bit kod için yine?..."

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • Modus Recordings

    Modus Record

    26 Kasım 2008
  • Wronchi Animation

    Wronchi Anim

    9 Mayıs 2011