首页 新闻 赞助 找找看

获取多个DataTable的并集

0
悬赏园豆:30 [已解决问题] 解决于 2015-09-15 17:37

各位大神好,我有个问题请教大家。

我现在有多个DataTable,有什么方法能够快速获取这几个DataTable的相同数据行么?

比如DataTable1中有10条数据,而DataTable2中也有10条数据,其中有两条数据一模一样,怎么快速获取这2条数据。DataTable的个数不确定,可能有十几个,有没有不用手写循环的方法快速获取么?

我尝试了用DataTable.AsEnumerable().Intersect方法,但是VS提醒没有这方法。

谢谢。

祥_venux的主页 祥_venux | 初学一级 | 园豆:175
提问于:2015-09-14 12:55
< >
分享
最佳答案
1
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Age",typeof(string));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Address", typeof(string));

            DataRow dA = dt.NewRow();
            dA["Age"] = "45";
            dA["Name"] = "王五";
            dA["Address"] = "BBBBBBBBBbbbbbbbb";
            dt.Rows.Add(dA);

            DataRow dA1 = dt.NewRow();
            dA1["Age"] = "123";
            dA1["Name"] = "张三";
            dA1["Address"] = "河南省济源市";
            dt.Rows.Add(dA1);


            DataRow dA2 = dt.NewRow();
            dA2["Age"] = "123";
            dA2["Name"] = "张三";
            dA2["Address"] = "河南省济源市";
            dt.Rows.Add(dA2);


            //再复制一个DataTable和上面的DataTable结构一样
            DataTable dt1 = dt.Clone();
            //添加数据
            DataRow dr1 = dt1.NewRow();
            dr1["Age"] = "123";
            dr1["Name"] = "张三";
            dr1["Address"] = "河南省济源市";
            dt1.Rows.Add(dr1);

            DataRow dr2 = dt1.NewRow();
            dr2["Age"] = "45";
            dr2["Name"] = "王五";
            dr2["Address"] = "BBBBBBBBBbbbbbbbb";
            dt1.Rows.Add(dr2);


            DataRow dr3 = dt1.NewRow();
            dr3["Age"] = "56";
            dr3["Name"] = "赵六";
            dr3["Address"] = "FSDREWGF@!$#@!@#";
            dt1.Rows.Add(dr3);


            //将两个DataRow连接起来,当然有多少个DataTable就可以连接多少
            var KV= dt.Rows.Cast<DataRow>().Concat(dt1.Rows.Cast<DataRow>()).GroupBy((dr) =>
                {

                    //用列数据当键名
                    //只有这些列值全部相等才会一样
                    return new
                    { 
                       Age=  dr["Age"].ToString(), 
                       Name=dr["Name"].ToString(),
                       Address=dr["Address"].ToString()
                    };
                }).Where(V=>V.Count()>1);


            //打印出 找到的重复数据
            foreach (var item in KV)
            {
                Console.WriteLine(item.Key.Name);
            }
        }
    }
}

如上面,我建了二个DataTable,其中 张三,和王五分别分布在二个DataTable中。当然你建多少个都可以

收获园豆:30
需要格局 | 老鸟四级 |园豆:2145 | 2015-09-14 16:52

不好意思,昨天中午忙着赶这功能,最后直接用了三层循环做了。多谢帮助~

祥_venux | 园豆:175 (初学一级) | 2015-09-15 17:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册