Ü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?

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

Antonio Bakula
quelle
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.

Kibbee
quelle