SORU
18 Aralık 2008, PERŞEMBE


Zarif bir şekilde eğer birden fazla boolean olup olmadığını belirlemek "true"

Beş boolean değerleri bir dizi var. Eğer bunlardan birini daha doğruysa, belirli bir işlevi excecute istiyorum. Bana bir tek bu durumu kontrol etmek için izin verecek, aklınıza gelebilecek en zarif yolu vardır, ne deyim? Hedef dil C# ama diğer diller için de çözümler (dahili fonksiyonları belirli bahsediyoruz sürece) ilgileniyorum.

İlginç bir seçenek, bir bayt içinde Boolean değerleri saklamak doğru bir kayma yapmak ve orijinal bayt ile karşılaştırmak için. if(myByte && (myByte >> 1)) gibi bir şey Ama bu bir bayt (bitArray?) için ayrı mantıksal dönüştürme gerektirir ve biraz (cinas tasarlamak) sakar gibi[değiştir]Üzgünüm, bu olmalıdırif(myByte & (myByte - 1))[/Düzenle]

Not: Bu ders klasik çok yakın "nüfus sayımı", "ayrıca yanlara doğru" ya da "Hamming ağırlığı" programlama problemi - ama pek aynı sayılmaz. Eğer birden fazla ise tek bit birçok ayarlanır bilmek ihtiyacım yok. Umudum, bunu yapmanın daha basit bir yolu var.

CEVAP
18 Aralık 2008, PERŞEMBE


Hakkında

  if ((bool1? 1:0)   (bool2? 1:0)   (bool3? 1:0)   
      (bool4? 1:0)   (bool5? 1:0) > 1)
      // do something

ya da yaygın bir yöntem

   public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
    {
       int trueCnt = 0;
       foreach(bool b in bools)
          if (b && (  trueCnt > threshold)) 
              return true;
       return false;          
    } 

ya da diğer cevaplar önerdiği gibi SERİ kullanma

    public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
    { return bools.Count(b => b) > threshold; }

(Joel Coehoorn öneri eklemek için:DÜZENLE (.Net 2.x ve üstü)

    public void ExceedsThreshold<T>(int threshold, 
                      Action<T> action, T parameter, 
                      IEnumerable<bool> bools)
    { if (ExceedsThreshold(threshold, bools)) action(parameter); }

ya da içinde .Net 3.5 ve daha sonra:

    public void ExceedsThreshold(int threshold, 
            Action action, IEnumerable<bool> bools)
    { if (ExceedsThreshold(threshold, bools)) action(); }

ya IEnumerable<bool> bir uzantısı olarak

  public static class IEnumerableExtensions
  {
      public static bool ExceedsThreshold<T> 
         (this IEnumerable<bool> bools, int threshold)
      { return bools.Count(b => b) > threshold; }
  }

kullanımı olacaktır:

  var bools = new [] {true, true, false, false, false, false, true};
  if (bools.ExceedsThreshold(3))
      // code to execute  ...

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 99being99

    99being99

    2 EYLÜL 2008
  • RickardRick

    RickardRick

    9 Mart 2007
  • talkandroid

    talkandroid

    27 Mayıs 2010