Finding the intersection of two .NET DataTables

前端 未结 4 1523
野的像风
野的像风 2020-12-09 22:30

Is there a relatively straightforward way to get the intersection of two DataTables in .NET?

I can think of the obvious ways (iterating over both tables myself in O(

相关标签:
4条回答
  • 2020-12-09 22:45

    With .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);
        }
    }
    
    0 讨论(0)
  • 2020-12-09 22:50

    Saw this example on MSDN which you may find useful. Its using the LINQ syntax.

    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);
    }
    
    0 讨论(0)
  • 2020-12-09 22:55

    Since you are using .NET 2.0, you should look at re-implementing the Intersect method.

    This psuedo-code should be very helpful for you.

    0 讨论(0)
  • 2020-12-09 22:58

    protected void Page_Load(object sender, 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"]);
        }
    }
    
    0 讨论(0)
提交回复
热议问题