2009-06-09 10 views

risposta

6

Dubito che ci sia alcun modo si potrebbe farlo senza un ciclo sotto il cofano (come BitArray può essere arbitrariamente lungo, a differenza BitVector32), ma se si don' t vuole scrivere voi stessi:

var hasAnyTrue = input.Cast<bool>().Contains(true); 
var hasAnyFalse = input.Cast<bool>().Contains(false); 
+0

usa .Any() che è più leggibile – juFo

1

Non so se è possibile farlo utilizzando un BitArray, ma se si utilizza un int, long ecc., Quindi controllare se è maggiore di 0 (per vero) o inferiore al valore massimo di il tipo di dati (per falso) che lo farebbe.

quindi qualcosa di simile:

bool IsTrue (int bitArray) 
{ 
    return bitArray != 0; 
} 


bool isFalse (int bitArray) 
{ 
    return bitArray != int.MinValue; 
} 
+0

infatti, che stava per essere il mio suggerimento troppo ammesso che getta ok. – Ian

+3

BitArray è un tipo. Non è un 'int'. –

+0

Sì, ma come hai detto tu non c'è davvero un modo per controllare i valori senza fare un ciclo. Stavo solo offrendo un modo di controllare un array di bit, non necessariamente usando il tipo BitArray. – kemiller2002

1

indicizzazione nel BitArray e controllare i singoli boolean valori è una soluzione ovvia. Se sei preoccupato per le prestazioni, dovresti innanzitutto considerare la creazione della tua astrazione, ma se preferisci utilizzare BitArray per la maggior parte delle operazioni, puoi eseguire il controllo utilizzando CopyTo su un valore int[] della dimensione corretta (Count >> 5) e quindi eseguire controlli zero o non nulli su questi inte in modo appropriato.

2

Se si utilizza la classe BitArray da System.Collections, è possibile utilizzare il seguente codice per determinare se qualcosa è vero.

C# versione

var anyTrue = myArray.Cast<bool>().Any(x => x); 

VB.Net Versione

Dim anyTrue = myArray.Cast(Of Boolean)().Any(Function(x) x) 
+1

Qualsiasi vantaggio nel non andare con il più semplice '.Contains (true)' invece di 'Any'? In realtà, questo era il modo in cui l'avevo fatto inizialmente, ma mi è venuto in mente 'Contains' e l'ho cambiato perché non riuscivo a trovare alcun motivo specifico. Idee? –

Problemi correlati