Vérifier si la valeur existe dans dataTable?


92

J'ai DataTable avec deux colonnes Author et Bookname .

Je veux vérifier si la valeur de chaîne donnée Author existe déjà dans le DataTable. Existe-t-il une méthode intégrée pour le vérifier, comme pour les tableaux array.contains?


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

Réponses:


206

Vous pouvez utiliser LINQ-to-DataSetavec Enumerable.Any:

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

Une autre approche consiste à utiliser DataTable.Select:

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

Q: que se passe-t-il si nous ne connaissons pas les colonnes Headers et que nous voulons savoir si une valeur de cellule PEPSIexiste dans les colonnes des lignes? Je peux tout boucler pour le savoir, mais y a-t-il une meilleure façon? -

Oui, vous pouvez utiliser cette requête:

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

Ajoutez-les System.Data.DataSetExtensionsà la référence et using System.Linq;à l'utilisation de la classe
5377037

Parmi les deux solutions, laquelle serait la plus rapide?
Paul Alexander

1
@PaulAlexander: il n'y a pas de grande différence. Mais l'ancienne DataTable.Selectsyntaxe est limitée alors que LINQ peut utiliser le framework .NET complet ou des méthodes personnalisées. Donc, seulement si vous êtes bloqué sur .NET 2, vous devriez utiliser DataTable.Select, sinon je préférerais toujours LINQ
Tim Schmelter

Si vous vous souciez des performances et que vous disposez de grands ensembles de données, tbl.Select()est considérablement plus rapide que les autres approches.
HerrimanCoder

@TimSchmelter - Great Tim. Mais si l'utilisateur ne connaît pas le nom de la colonne mais veut toujours obtenir toutes les lignes qui correspondent à la valeur de recherche, comment cela peut-il être fait?
Chandan Kumar

13

Vous pouvez utiliser Linq. Quelque chose comme:

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
}

ajoutez à votre clause using:

using System.Linq;

et ajouter :

System.Data.DataSetExtensions

aux références.


5

Vous devriez pouvoir utiliser la méthode DataTable.Select () . Vous pouvez nous le faire comme ça.

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

La fonction Select () renvoie un tableau de DataRows pour les résultats correspondant à l'instruction where.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.