Überprüfen Sie, ob der Wert in dataTable vorhanden ist.


88

Ich habe DataTable mit zwei Spalten Autor und Buchname .

Ich möchte überprüfen, ob der angegebene Zeichenfolgenwert Author bereits in der DataTable vorhanden ist. Gibt es eine eingebaute Methode, um dies zu überprüfen, wie bei Arrays array.contains?


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

Antworten:


197

Sie können verwenden LINQ-to-DataSetmit Enumerable.Any:

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

Ein anderer Ansatz ist zu verwenden DataTable.Select:

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

F: Was ist, wenn wir die PEPSISpaltenüberschriften nicht kennen und herausfinden möchten, ob in den Spalten einer Zeile ein Zellenwert vorhanden ist? Ich kann alles wiederholen, um herauszufinden, aber gibt es einen besseren Weg? - -

Ja, Sie können diese Abfrage verwenden:

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

Fügen Sie diese System.Data.DataSetExtensionszur Referenz und using System.Linq;zur Verwendung der Klasse hinzu
5377037

Welche der beiden Lösungen wäre schneller?
Paul Alexander

1
@ PaulAlexander: Es gibt keinen großen Unterschied. Die alte DataTable.SelectSyntax ist jedoch begrenzt, während LINQ das vollständige .NET-Framework oder benutzerdefinierte Methoden verwenden kann. Also nur, wenn Sie an .NET 2 festhalten, sollten Sie verwenden DataTable.Select, sonst würde ich immer LINQ
Tim Schmelter

Wenn Sie Wert auf Leistung legen und über große Datenmengen verfügen, tbl.Select()ist dies erheblich schneller als bei den anderen Ansätzen.
HerrimanCoder

@ TimSchmelter - Großartiger Tim. Aber wenn der Benutzer den Spaltennamen nicht kennt und dennoch alle Zeilen abrufen möchte, die dem Suchwert entsprechen, wie kann dies durchgeführt werden?
Chandan Kumar

13

Sie können Linq verwenden. Etwas wie:

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

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

Fügen Sie Ihrer using-Klausel Folgendes hinzu:

using System.Linq;

und hinzufügen:

System.Data.DataSetExtensions

auf Referenzen.


5

Sie sollten in der Lage sein, die DataTable.Select () -Methode zu verwenden. Sie können uns das so machen.

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

Die Select () - Funktion gibt ein Array von DataRows für die Ergebnisse zurück, die mit der where-Anweisung übereinstimmen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.