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?

Valterriann
la source
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"));
Tim Schmelter
la source
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;
mservidio
la source
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.

Antonio Bakula
la source
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.

Kibbee
la source