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
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
http://dotnetperls.com/list-find-methods ha qualcosa su esiste & trovare.
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.
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"))
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.
No, è in un elenco
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