2010-06-15 18 views
8

Ho una lista che creo da un DataTabe che contiene solo una colonna. Diciamo che la colonna si chiama MyColumn. Ogni elemento nell'elenco è un array di oggetti che contiene le mie colonne, in questo caso solo uno (MyColumn). Qual è il modo più elegante per verificare se quell'array di oggetti contiene un determinato valore?Cerca in una lista <DataRow>?

risposta

9
var searchValue = SOME_VALUE; 
var result = list.Where(row => row["MyColumn"].Equals(searchValue)); // returns collection of DataRows containing needed value 
var resultBool = list.Any(row => row["MyColumn"].Equals(searchValue)); // checks, if any DataRows containing needed value exists 
0

http://dotnetperls.com/list-find-methods ha qualcosa su esiste & trovare.

+0

La cosa è, la lista contiene una matrice che ho bisogno di cercare in ... quindi penso che non devo cercare la lista, ma la matrice (s) all'interno della lista. – grady

0

Beh, dipende da quale versione C# e .NET ci si trova, per 3,5 si potrebbe farlo con LINQ:

var qualiyfyingRows = 
    from row in rows 
    where Equals(row["MyColumn"], value) 
    select row; 

// We can see if we found any at all through. 
bool valueFound = qualifyingRows.FirstOrDefault() != null; 

che vi darà entrambe le righe che corrispondono e un bool che ti dice se hai trovato qualcosa.

Tuttavia, se non si dispone di LINQ o dei metodi di estensione che vengono con esso si dovrà cercare la lista "Old Skool":

DataRow matchingRow = null; 
foreach (DataRow row in rows) 
{ 
    if (Equals(row["MyColumn"], value)) 
    { 
     matchingRow = row; 
     break; 
    } 
} 

bool valueFound = matchingRow != null; 

che vi darà la prima riga che corrisponde, esso ovviamente può essere modificato per trovare tutte le righe che corrispondono, il che renderebbe i due esempi più o meno uguali.

La versione LINQ ha una grande differenza, tuttavia, l'IEnumerable che si ottiene viene posticipato, quindi il calcolo non verrà eseguito finché non si annoverano effettivamente i membri. Non so abbastanza su DataRow o sulla tua applicazione per sapere se questo può essere un problema o no, ma è stato un problema in un pezzo del mio codice che trattava di NHibernate. Fondamentalmente stavo enumerando una sequenza che i membri non erano più validi.

È possibile creare facilmente IEnumerables differiti tramite lo iterators in C# 2.0 e versioni successive.

0

Se doveste fare spesso questa ricerca, penso che non sia conveniente scrivere ogni volta LINQ-expression. Mi piacerebbe scrivere estensione-metodo come questo:

private static bool ContainsValue(this List<DataRow> list, object value) 
{ 
    return list.Any(dataRow => dataRow["MyColumn"].Equals(value)); 
} 

E dopo che la ricerca marca:

if (list.ContainsValue("Value")) 
0

forse ho letto male questo, ma sembra che i dati sono attualmente in una List<object[]> e non in un DataTable in modo da ottenere gli elementi che corrispondono a determinati criteri si potrebbe fare qualcosa di simile:

var matched = items.Where(objArray => objArray.Contains(value)); 

articoli sarebbero tua lista di oggetti []: s e abbinati sarebbe un IEnumerable []> con l'oggetto []: S con il valore in.

+0

No, è in un elenco che contiene un array di oggetti ... – grady

Problemi correlati