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.