Verificare se il valore esiste in dataTable?


91

Ho DataTable con due colonne Author e Bookname .

Voglio verificare se il valore di stringa specificato Author esiste già in DataTable. C'è un metodo integrato per controllarlo, come per gli array array.contains?


8
LINQ? table.Any(t => t.Author == author);
Davio

Risposte:


206

Puoi usare LINQ-to-DataSetcon Enumerable.Any:

String author = "John Grisham";
bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));

Un altro approccio consiste nell'utilizzare DataTable.Select:

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

D: cosa succede se non conosciamo le intestazioni delle colonne e vogliamo scoprire se esiste un valore di cella PEPSIin qualsiasi colonna delle righe? Posso ripetere tutto per scoprirlo, ma c'è un modo migliore? -

Sì, puoi utilizzare questa query:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));

Aggiungili System.Data.DataSetExtensionsper fare riferimento e using System.Linq;utilizzare la classe
5377037

Tra le due soluzioni, quale sarebbe più veloce?
Paul Alexander

1
@PaulAlexander: non c'è una grande differenza. Ma la vecchia DataTable.Selectsintassi è limitata mentre LINQ può utilizzare il framework .NET completo o metodi personalizzati. Quindi solo se sei bloccato su .NET 2 dovresti usare DataTable.Select, altrimenti preferirei sempre LINQ
Tim Schmelter

Se ti interessano le prestazioni e disponi di set di dati di grandi dimensioni, tbl.Select()è notevolmente più veloce rispetto agli altri approcci.
HerrimanCoder

@TimSchmelter - Great Tim. Ma se l'utente non conosce il nome della colonna ma desidera comunque ottenere tutte le righe che corrispondono al valore di ricerca, come può essere fatto?
Chandan Kumar

13

Puoi usare Linq. Qualcosa di simile a:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;

8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

aggiungi alla tua clausola using:

using System.Linq;

e aggiungi :

System.Data.DataSetExtensions

ai riferimenti.


5

Dovresti essere in grado di utilizzare il metodo DataTable.Select () . Puoi usarlo in questo modo.

if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
    ...

La funzione Select () restituisce un array di DataRows per i risultati che corrispondono all'istruzione where.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.