¿Comprobar si existe valor en dataTable?


91

Tengo DataTable con dos columnas Author y Bookname .

Quiero verificar si el valor de cadena dado Autor ya existe en el DataTable. ¿Hay algún método incorporado para verificarlo, como para las matrices array.contains?


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

Respuestas:


206

Puede usar LINQ-to-DataSetcon Enumerable.Any:

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

Otro enfoque es utilizar DataTable.Select:

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

P: ¿qué PEPSIpasa si no conocemos los encabezados de las columnas y queremos saber si existe algún valor de celda en alguna fila de columnas? Puedo recorrerlo todo para averiguarlo, pero ¿hay una manera mejor? -

Sí, puede utilizar esta consulta:

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

Agregue estos System.Data.DataSetExtensionspara referencia y using System.Linq;para usar la clase
5377037

De las dos soluciones, ¿cuál sería más rápida?
Paul Alexander

1
@PaulAlexander: no hay una gran diferencia. Pero la DataTable.Selectsintaxis anterior es limitada, mientras que LINQ puede usar el marco .NET completo o métodos personalizados. Entonces, solo si está atascado en .NET 2, debe usar DataTable.Select; de lo contrario, siempre preferiría LINQ
Tim Schmelter

Si le preocupa el rendimiento y tiene grandes conjuntos de datos, tbl.Select()es mucho más rápido que los otros enfoques.
HerrimanCoder

@TimSchmelter - Gran Tim. Pero si el usuario no conoce el nombre de la columna, pero aún desea obtener todas las filas que coinciden con el valor de búsqueda, ¿cómo se puede hacer?
Chandan Kumar

13

Puede utilizar Linq. Algo como:

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
}

agregar a su cláusula de uso:

using System.Linq;

y añadir :

System.Data.DataSetExtensions

a las referencias.


5

Debería poder utilizar el método DataTable.Select () . Puedes hacerlo así.

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

La función Select () devuelve una matriz de DataRows para los resultados que coinciden con la instrucción where.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.