propiedades example eventos ejemplo data columns .net datatable

.net - eventos - jquery table example



Encontrar la intersección de dos.NET DataTables (4)

¿Hay una manera relativamente directa de obtener la intersección de dos DataTables en .NET?

Puedo pensar en las formas obvias (iterar sobre ambas tablas en O (n ^ 2)), pero me gustaría algo un poco más elegante si está disponible. Sospecho que puede haber una manera inteligente que no estoy viendo. La legibilidad y la capacidad de mantenimiento son importantes, por supuesto, así que estoy tratando de mantenerme alejado de cualquier cosa demasiado "astuta".

¿Alguna buena idea?

EDITAR: Parece que Bryan Watts tiene una solución bastante buena para 3.5, pero desafortunadamente estoy en .NET 2.0 (que debería haber mencionado).


Con .NET 3.5:

using System.Data; public static class DataTableExtensions { public static IEnumerable<DataRow> Intersect(this DataTable table, DataTable other) { return table.AsEnumerable().Intersect(other.AsEnumerable()); } public static IEnumerable<DataRow> Intersect(this DataTable table, DataTable other, IEqualityComparer<DataRow> comparer) { return table.AsEnumerable().Intersect(other.AsEnumerable(), comparer); } }


Vi este ejemplo en MSDN que puede serle útil. Está usando la sintaxis LINQ.

DataSet ds = new DataSet(); ds.Locale = CultureInfo.InvariantCulture; FillDataSet(ds); DataTable orders = ds.Tables["SalesOrderHeader"]; DataTable details = ds.Tables["SalesOrderDetail"]; var query = from order in orders.AsEnumerable() join detail in details.AsEnumerable() on order.Field<int>("SalesOrderID") equals detail.Field<int>("SalesOrderID") where order.Field<bool>("OnlineOrderFlag") == true && order.Field<DateTime>("OrderDate").Month == 8 select new { SalesOrderID = order.Field<int>("SalesOrderID"), SalesOrderDetailID = detail.Field<int>("SalesOrderDetailID"), OrderDate = order.Field<DateTime>("OrderDate"), ProductID = detail.Field<int>("ProductID") }; foreach (var order in query) { Console.WriteLine("{0}/t{1}/t{2:d}/t{3}", order.SalesOrderID, order.SalesOrderDetailID, order.OrderDate, order.ProductID); }



vacío protegido Page_Load (remitente del objeto, EventArgs e) {

DataTable dt1 = new DataTable(); dt1.Columns.Add("ColX", typeof(int)); DataTable dt2 = new DataTable(); dt2.Columns.Add("ColX", typeof(int)); for (int i = 1; i <= 5; i++) { DataRow row = dt1.NewRow(); row["ColX"] = 5 + i; dt1.Rows.Add(row); row = dt2.NewRow(); row["ColX"] = 9 + i; dt2.Rows.Add(row); } intesect(dt1, dt2); } public void intesect(DataTable contacts1, DataTable contacts2) { var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(), DataRowComparer.Default); foreach (DataRow row in contacts) { Response.Write(row["ColX"]); } }