2012-07-30 28 views
14

Boolean değerleriyle dolu bir dizilim var ve kaç tane öğenin doğru olduğunu bilmek istiyorum. val yanlışsa, bir bool dizisindeki doğru (veya yanlış) öğelerin sayısını hesaplar mı?

private bool[] testArray = new bool[10] { true, false, true, true, false, true, true, true, false, false }; 

int CalculateValues(bool val) 
{ 
    return ??? 
} 

CalculateValues ​​val doğruysa 6 dönmek veya 4 olmalıdır.

Apaçık çözüm:

int CalculateValues(bool val) 
{ 
    int count = 0; 
    for(int i = 0; i<testArray.Length;i++) 
    { 
     if(testArray[i] == val) 
      count++; 
    } 
    return count; 
} 

bir "zarif" bir çözüm var mı?

cevap

27

LINQ kullanın. Sen gerçek sayım için testArray.Where(c => c).Count(); yapmak ya kullanabilirsiniz sahte çek

+4

aynı fikir olsa da, sayım koşullu aşırı kullanarak aşağıdaki cevaplar temizdir. –

33
return testArray.Count(c => c) 
11

için testArray.Where(c => !c).Count(); kullanabilirsiniz:

int CalculateValues(bool val) 
{ 
    return testArray.Count(c => c == val); 
} 

Bu val parametreye dayalı true ve false çekleri, yönetir. Böyle

2

deneyin şey:

bool[] testArray = new bool[10] { true, false, true, true, false, true, true, true, false, false }; 
bool inVal = true; 
int i; 

i = testArray.Count(ai => ai == inVal); 
-2

Bunu beğendim: testArray.Count(c => c) işlevsel doğru olsa

int trueCount = boolArray.Sum(x => x ? 1 : 0) ; 
+1

Neden "Say" işlevini yerine getirmek için Sum '? – Richard

+0

Çünkü daha basit, daha özlü ve noktaya. Where() '/' Count() 'işlevini seviyorsanız, aynı sonucu dizi öğesi başına ek bir yöntem çağrısı pahasına alırsınız. –

+1

"int trueCount = boolArray.Count (x => x)" ifadesinin çok daha özlü olduğunu ve – Richard

1

, bu sezgisel değil ve daha sonraki geliştirici c => c bölümünü şerit riski var bir şey yapmadığını düşünüyorum.

Bu

anlamlı bir ad ile ayrı ayrı lambda fonksiyonu bildirerek derisked edilebilir:

Func<bool, bool> ifTrue = x => x; 
return testArray.Count(ifTrue); 
İlgili konular