Sprawdź, czy wartość istnieje w dataTable?


92

Mam DataTable z dwiema kolumnami Autor i Bookname .

Chcę sprawdzić, czy podana wartość ciągu Autor już istnieje w DataTable. Czy jest jakaś wbudowana metoda sprawdzania tego, jak w przypadku tablic array.contains?


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

Odpowiedzi:


206

Możesz używać LINQ-to-DataSetz Enumerable.Any:

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

Innym podejściem jest użycie DataTable.Select:

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

P: co się stanie, jeśli nie znamy kolumn Nagłówki i chcemy sprawdzić, czy jakakolwiek wartość komórki PEPSIistnieje w kolumnach z wierszami? Mogę to wszystko zapętlić, aby się dowiedzieć, ale czy jest lepszy sposób? -

Tak, możesz użyć tego zapytania:

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

Dodaj je System.Data.DataSetExtensionsdo odniesienia i using System.Linq;do korzystania z klasy
5377037

Które z tych dwóch rozwiązań byłoby szybsze?
Paul Alexander

1
@PaulAlexander: nie ma wielkiej różnicy. Ale stara DataTable.Selectskładnia jest ograniczona, podczas gdy LINQ może używać pełnej platformy .NET lub metod niestandardowych. Więc tylko jeśli utkniesz na .NET 2, powinieneś użyć DataTable.Select, w przeciwnym razie zawsze wolałbym LINQ
Tim Schmelter

Jeśli zależy Ci na wydajności i masz duże zbiory danych, tbl.Select()jest znacznie szybszy niż inne podejścia.
HerrimanCoder

@TimSchmelter - Świetny Tim. Ale jeśli użytkownik nie zna nazwy kolumny, ale nadal chce uzyskać wszystkie wiersze pasujące do wyszukiwanej wartości, jak można to zrobić?
Chandan Kumar

13

Możesz użyć Linq. Coś jak:

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
}

dodaj do swojej klauzuli using:

using System.Linq;

i dodaj :

System.Data.DataSetExtensions

do referencji.


5

Powinieneś móc użyć metody DataTable.Select () . Możesz nam to w ten sposób.

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

Funkcja Select () zwraca tablicę DataRows dla wyników zgodnych z instrukcją where.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.