c# - llenar - ¿Itera a través de una DataTable para encontrar elementos en un objeto List?
convertir datatable a lista generica c# (5)
A medida que recorro un objeto DataTable , necesito verificar cada uno de sus objetos DataRow contra los elementos en una lista de cadenas genérica.
Encontré una publicación de blog usando el método Find de la Lista junto con un delegado, pero mientras que ese ejemplo tiene una clase separada (Person), estoy intentando algo como lo siguiente usando una instancia del objeto string :
// My definition of the List object.
List<string> lstAccountNumbers = new List<string>();
...
// I populate the List via its Add method.
...
foreach (DataRow drCurrentRow in dtMyDataTable.Rows)
{
if (lstAccounts.Find(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })
{
Found_DoSomething();
}
else
{
NotFound_DoSomethingElse();
}
}
Sin embargo, con esta sintaxis estoy recibiendo "No se puede convertir implícitamente el tipo ''cadena'' a ''bool''" para el bloque if .
¿Podría alguien aclarar qué estoy haciendo mal y cuál es la mejor manera de lograr lo que estoy tratando de hacer?
¿Por qué esto no funcionaría para ti?
foreach (DataRow drCurrentRow in dtMyDataTable.Rows)
{
if (lstAccounts.Contains(drCurrentRow["AccountNumber"].ToString()))
{
Found_DoSomething();
}
else
{
NotFound_DoSomethingElse();
}
}
El método Find de la lista devuelve una cadena, por lo que debe compararla con el método Equals o == . En ese caso, la condición if estará bien.
El problema es la parte if (lstAccounts.Find
.
Este Find
devolverá una cadena si se encuentra y el if
espera una salida bool.
Cambie su extracto para usar Exists
o compare su valor original con el resultado Find
.
Intenta usar linq, puedes crear un helper que tome el nombre del col, etc.
usando el sistema; utilizando System.Collections; utilizando System.Collections.Generic; usando System.Data; utilizando System.Linq; usando System.Web; usando System.Web.UI; utilizando System.Web.UI.WebControls;
namespace WebApplication1 {public partial class _Default: System.Web.UI.Page {protected void Page_Load (object remitente, EventArgs e) {DataTable table = new DataTable (); table.Columns.Add ("col1", typeof (cadena));
DataRow row;
row = table.NewRow();
row["col1"] = "123";
table.Rows.Add(row);
row = table.NewRow();
row["col1"] = "456";
table.Rows.Add(row);
LinqList<DataRow> rows = new LinqList<DataRow>(table.Rows);
// do a simple select
DataRow [] selectedRows = (from r in rows where (string)r["col1"] == "123" select r).ToArray();
if(selectedRows.Length > 0)
{
lable1.Text = "success";
}
else
{
lable1.Text = "failed";
}
}
}
// simple wrapper that implements IEnumerable<T>
internal class LinqList<T> : IEnumerable<T>, IEnumerable
{
IEnumerable items;
internal LinqList(IEnumerable items)
{
this.items = items;
}
#region IEnumerable<DataRow> Members
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
foreach (T item in items)
yield return item;
}
IEnumerator IEnumerable.GetEnumerator()
{
IEnumerable<T> ie = this;
return ie.GetEnumerator();
}
#endregion
}
}
El código tomado de esta url itera a través de una tabla de datos para encontrar elementos en un objeto de lista?
Mismo delegado. Método diferente. Desea usar Exists Not Find. Buscar Devuelve un valor mientras existe devuelve un bool.
if (lstAccounts.Exists(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })