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

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

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

Kibbee
fuente