DataTable数据对比问题!

qian6515 2014-02-24 05:21:34
我用NPOI读取了2个execl,数据存在了DataTable里面,并设置为相同结构!如下:
DataTable1:
编号 名称1
1 A
2 B
3 C
4 D
8 E

DataTable2:
编号 名称2
1 a
2 b
3 c
4 d
5 e
6 f
7 q

合并2个数据,只取编号相同的行,并且加数据并列,计算!其中DataTable1如有数据如编号8,在DataTable2找不到的,也要输出!如
编号 名称1 名称2 计算
1 A a A/a
2 B b B/b
3 C c C/c
4 D d D/d
8 E 0 E/e
请大神帮帮!!
...全文
273 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wodiaozuida1234565 2014-02-24
  • 打赏
  • 举报
回复
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 13 楼 hwenycocodq520 的回复:
无语csdn,怎么连发两次

Console.WriteLine("合计:" + result.Sum(a => Convert.ToInt32(a.Name1)));
就是在list集合后再加一行合计!!返回一个大的list集合!
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 13 楼 hwenycocodq520 的回复:
无语csdn,怎么连发两次

Console.WriteLine("合计:" + result.Sum(a => Convert.ToInt32(a.Name1)));
我想单独在list最后面再加一行合计!应该如何写!!
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复
无语csdn,怎么连发两次

Console.WriteLine("合计:" + result.Sum(a => Convert.ToInt32(a.Name1)));
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复

//你上面2楼那个普通的合并方法可以修改成这样就可以了
public DataTable Merge(DataTable table1, DataTable table2)
{
    DataTable table = new DataTable();
    //init new table
    for (int i = 0; i < table1.Rows.Count; i++)
    {
        int j;
        for (j = 0; j < table2.Rows.Count; j++)
        {
            if (table1.Rows[i][0].ToString() == table2.Rows[j][0].ToString())
            {
                //add new row 表1表2相同编号的行
                break;
            }
        }
        if (j >= table2.Rows.Count)
        {
            //add new row 表1有表2没有的行
        }
    }
    return table;
}
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复

//你上面2楼那个普通的合并方法可以修改成这样就可以了
public DataTable Merge(DataTable table1, DataTable table2)
{
    DataTable table = new DataTable();
    //init new table
    for (int i = 0; i < table1.Rows.Count; i++)
    {
        int j;
        for (j = 0; j < table2.Rows.Count; j++)
        {
            if (table1.Rows[i][0].ToString() == table2.Rows[j][0].ToString())
            {
                //add new row 表1表2相同编号的行
                break;
            }
        }
        if (j >= table2.Rows.Count)
        {
            //add new row 表1有表2没有的行
        }
    }
    return table;
}
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 9 楼 hwenycocodq520 的回复:

//我这里写的字段2都是字符串类型,你可以按照你需要的修改这个语句
//关键是进行左连接查询就可以了
var result = from DataRow d1 in dt1.Rows
             join DataRow d2 in dt2.Rows
             on d1[0] equals d2[0]
             into dt3
             from p in dt3.DefaultIfEmpty()
             select new
             {
                 No = d1[0],   //编号
                 Name1 = d1[1],//名称1
                 Name2 = p != null ? p[1] : "0"//名称2
             };
result.ToList().ForEach(a =>
{
    Console.WriteLine(a.No + " " + a.Name1 + "  " + a.Name2 + " " + a.Name1 + "/" + a.Name2);
});
大神啊!!计算效率立马提高了几个级别!再请教一个问题,如果NAME1是数值,我要对NAME1进行相加,并在输出的最后显示合计的数值,如何写!
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复

//我这里写的字段2都是字符串类型,你可以按照你需要的修改这个语句
//关键是进行左连接查询就可以了
var result = from DataRow d1 in dt1.Rows
             join DataRow d2 in dt2.Rows
             on d1[0] equals d2[0]
             into dt3
             from p in dt3.DefaultIfEmpty()
             select new
             {
                 No = d1[0],   //编号
                 Name1 = d1[1],//名称1
                 Name2 = p != null ? p[1] : "0"//名称2
             };
result.ToList().ForEach(a =>
{
    Console.WriteLine(a.No + " " + a.Name1 + "  " + a.Name2 + " " + a.Name1 + "/" + a.Name2);
});
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 7 楼 hwenycocodq520 的回复:
[quote=引用 6 楼 qian6515 的回复:] [quote=引用 5 楼 hwenycocodq520 的回复:] 8 E 0 E/e 小e哪里有对应
这个小e应该是0,我写错了![/quote] 0也错啊,除数不能为0[/quote] 大哥,不要纠结于这个~只是个意思~
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复
引用 6 楼 qian6515 的回复:
[quote=引用 5 楼 hwenycocodq520 的回复:] 8 E 0 E/e 小e哪里有对应
这个小e应该是0,我写错了![/quote] 0也错啊,除数不能为0
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 5 楼 hwenycocodq520 的回复:
8 E 0 E/e 小e哪里有对应
这个小e应该是0,我写错了!
智商余额不足 2014-02-24
  • 打赏
  • 举报
回复
8 E 0 E/e 小e哪里有对应
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 3 楼 feiyun0112 的回复:
DataView dv2 =table2.DefaultView; for (int i = 0; i < table1.Rows.Count; i++) { dv.RowFilter = "编号="+table1.Rows[i][0].ToString(); if (dv.Count>0) { DataRow newRow = table.NewRow(); newRow[0] = table1.Rows[i][0].ToString(); newRow[1] = table1.Rows[i][1].ToString(); newRow[2] = dv[0][1].ToString(); newRow[3] = Convert.ToInt32(table1.Rows[i][1].ToString()) / Convert.ToInt32(dv[0][1].ToString()); table.Rows.Add(newRow); } else //不存在 { DataRow newRow = table.NewRow(); newRow[0] = table1.Rows[i][0].ToString(); newRow[1] = table1.Rows[i][1].ToString(); newRow[2] = ...; newRow[3] = ...; table.Rows.Add(newRow); } }
看您的代码有点生,dv是指什么?
feiyun0112 2014-02-24
  • 打赏
  • 举报
回复
DataView dv2 =table2.DefaultView; for (int i = 0; i < table1.Rows.Count; i++) { dv.RowFilter = "编号="+table1.Rows[i][0].ToString(); if (dv.Count>0) { DataRow newRow = table.NewRow(); newRow[0] = table1.Rows[i][0].ToString(); newRow[1] = table1.Rows[i][1].ToString(); newRow[2] = dv[0][1].ToString(); newRow[3] = Convert.ToInt32(table1.Rows[i][1].ToString()) / Convert.ToInt32(dv[0][1].ToString()); table.Rows.Add(newRow); } else //不存在 { DataRow newRow = table.NewRow(); newRow[0] = table1.Rows[i][0].ToString(); newRow[1] = table1.Rows[i][1].ToString(); newRow[2] = ...; newRow[3] = ...; table.Rows.Add(newRow); } }
qian6515 2014-02-24
  • 打赏
  • 举报
回复
引用 1 楼 feiyun0112 的回复:
建个DataTable3,循环DataTable1,查找DataTable2,写数据到DataTable3 ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
已经做到取到相同数据,但是不存在的数据不知道如何处理!
public DataTable Merge(DataTable table1, DataTable table2)
        {
            DataTable table = new DataTable();
            DataRow row = table.NewRow();
            row[0] = "编号";
            row[1] = "名称1";
            row[2] = "名称2";
            row[3] = "计算";
            table.Rows.Add(row);
             
            for (int i = 0; i < table1.Rows.Count; i++)
            {
                for (int j = 0; j < table2.Rows.Count; j++)
                {
                    if (table1.Rows[i][0].ToString() == table2.Rows[j][0].ToString())
                    {
                        DataRow newRow = table.NewRow();
                        newRow[0] = table1.Rows[i][0].ToString();
                        newRow[1] = table1.Rows[i][1].ToString();
                        newRow[2] = table2.Rows[j][1].ToString();
                        newRow[3] = Convert.ToInt32(table1.Rows[i][1].ToString()) / Convert.ToInt32(table1.Rows[j][1].ToString());
                        table.Rows.Add(newRow);
                    }
                }
            }
 
            return table;
        }
feiyun0112 2014-02-24
  • 打赏
  • 举报
回复
建个DataTable3,循环DataTable1,查找DataTable2,写数据到DataTable3

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧