首页 新闻 会员 周边 捐助

C#DataTable俩个对比取值问题

0
悬赏园豆:50 [已解决问题] 解决于 2021-11-22 14:51

有没有整体判断 尽可能不用For循环一个一个判断

C#
园友2288976的主页 园友2288976 | 初学一级 | 园豆:12
提问于:2021-11-21 19:29
< >
分享
最佳答案
0

如果你要进行多次对比的话,可以先将dt2扔到一个字典中,只需要循环一次,当然如果只是一次,那就没必要了,直接用linq最简单

static void Start() {
            var dt1 = StructTable1();
            var dt2 = StructTable2();
            var dict = dt2.AsEnumerable().ToDictionary(dr => { return Convert.ToInt32(dr["ID"]); }); 
            int id = Convert.ToInt32(dt1.Rows[0]["ID"]);
            DataRow n = dict[id];
            string name = n["Name"].ToString();
            int age = Convert.ToInt32(n["Age"]);
        }
        static DataTable StructTable1() {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add(new DataColumn("ID", typeof(int)));
            dt1.Columns.Add(new DataColumn("Name", typeof(string)));
            DataRow dr1 = dt1.NewRow();
            dr1["ID"] = 1;
            dr1["Name"] = "45";
            dt1.Rows.Add(dr1);
            return dt1;
        }
        static DataTable StructTable2() {
            DataTable dt2 = new DataTable();
            dt2.Columns.Add(new DataColumn("ID", typeof(int)));
            dt2.Columns.Add(new DataColumn("Name", typeof(string)));
            dt2.Columns.Add(new DataColumn("Age", typeof(string)));
            DataRow dr1 = dt2.NewRow();
            dr1["ID"] = 1;
            dr1["Name"] = "45";
            dr1["Age"] = 91;
            DataRow dr2 = dt2.NewRow();
            dr2["ID"] = 2;
            dr2["Name"] = "456";
            dr2["Age"] = 92;
            dt2.Rows.Add(dr1);
            dt2.Rows.Add(dr2);
            return dt2;
        }
收获园豆:50
WmW | 菜鸟二级 |园豆:424 | 2021-11-22 11:27
其他回答(3)
0
dudu | 园豆:30948 (高人七级) | 2021-11-21 19:33

我用了---有没有Linq扩展方法 简洁一点的大佬 我写的太多了 能否给个Demo

支持(0) 反对(0) 园友2288976 | 园豆:12 (初学一级) | 2021-11-21 19:56
0

1.listA.Where(t=>t.Value == listB.FirstOrDefault(g=>t.Id == g.Id).Value);//效率较低,尤其没索引

2.listA.Join(listB, t => t.Id, g => g.Id, (a, b) => new { a.Id, Bid = b.Id,b.N }).Where(t=>t.Id == t.Bid);//效率较高

others...

大致如上,实体和表操作自己替换。

花飘水流兮 | 园豆:13615 (专家六级) | 2021-11-21 22:06

嗯嗯 好的 大佬

我只这样写的
var datalist = from n in dt1.AsEnumerable()
from m in dt2.AsEnumerable()
where m.Field<string>("Name") == n.Field<string>("Name")
select new
{

                           ID = n["ID"].ToString(),
                           Name = n["Name"].ToString(),
                           Age = m["Age"].ToString()
                       };
支持(0) 反对(0) 园友2288976 | 园豆:12 (初学一级) | 2021-11-21 22:11
0

Linq最简洁直接,Lambda好用到爆
ListB.Where(d=>ListA.Any(x=>x.ID==d.ID))

CanIHelpYou? | 园豆:207 (菜鸟二级) | 2021-11-22 10:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册