首页 新闻 会员 周边

datatable 合并行

0
悬赏园豆:100 [已关闭问题]

datatable中相同ID只有最后一列不同,现在想导出excel时将相同ID的相同字段合并为一行,最后那个不同列合并成这一行的最后一个单元格~
eg:

1  a  b  c

1  a  b  d

1  a  b  e

2  z  s  k

2  z  s  p

....

结果:

1 a b c;d;e

2 z s k;p

问题补充: Astar,能否提供简单的代码示例?那样子循环怎么写?新手请多包涵~
ht_yin的主页 ht_yin | 初学一级 | 园豆:100
提问于:2010-06-19 15:41
< >
分享
其他回答(5)
0

再新建一个DataTable,为四列。遍历第一个DataTable,生成第二种的形式。

Astar | 园豆:40805 (高人七级) | 2010-06-19 16:15
0

写个自定义比较器,排序后进行筛选判断。

我以前做过这样一个案例:

abc,goo,aebb,wpp,goaa

等这样的,也是分组,结果如下:

abc,aebb

goaa,goo

wpp

我把代码粘这儿,应该可以帮到你。

FactoryComparer类

namespace _56fix.BLL
{
    /// <summary>
    /// 适用于厂商比较名称的比较器
    /// </summary>
    public class FactoryComparer : IComparer<Factory>
    {
        public int Compare(Factory x, Factory y)
        {
            return string.Compare(x.FirstLetter, y.FirstLetter);
        }       
    }
}

 

public string GetFactories()
    {
        StringBuilder str = new StringBuilder();
        List<Factory> items = FactoryManager.GetFactories(false, true);
        char ch = '0';

        str.Append("<div class='clear'></div><div class='bd'>");
        str.Append("<div class='descTitle f14 cb'>厂商统计信息</div>");
        str.AppendFormat("<div class='p10'>厂商总数:{0}</div>", items.Count);
        str.Append("</div><div class='clear separator'></div>");

        foreach (Factory item in items)
        {
            char c = item.FirstLetter[0];
            if (c > ch)
            {
                if (ch != '0')
                {
                    str.Append("</ul></div></div><div class='clear separator'></div>");
                }
                str.Append("<div class='bd'>");
                //链接Id样式:表名_类型Id
                str.AppendFormat("<div class='descTitle f14 cb'>名称以 {0} 开头的厂商</div>", c);
                str.Append("<div class='p10'><ul class='listNav'>");
            }
            str.AppendFormat("<li><a href='../ShowFactory_{0}.aspx' id='Factory_0_{1}' title='{2}'>{2}</a></li>", item.Id, item.Id, item.BrandName);
            ch = c;
        }
        str.Append("</ul></div></div><div class='clear separator'></div>");
        return str.ToString();
    }

Ropean | 园豆:121 (初学一级) | 2010-06-19 16:22
0

数据库处理吧,程序处理太麻烦了。

清海扬波 | 园豆:825 (小虾三级) | 2010-06-19 17:22
0

我写了一个函数,你试试看吧,输入的 table 必须要有4列,第4列需要是string 类型,前3列存储你说的数据。

代码
static void CompressTable(DataTable table)
{
Dictionary
<string, DataRow> dict = new Dictionary<string, DataRow>(); //这个字典用于查找第一第二列相同的项目

List
<DataRow> removeRows = new List<DataRow>(); //这个List 存储需要删除的重复行

foreach (DataRow row in table.Rows)
{
string key = row[0].ToString() + ";" + row[1].ToString();
DataRow row1;
if (dict.TryGetValue(key, out row1))
{
//如果找到重复的行,将第三列和第一个重复行的第4列合并

if (row1[4] == DBNull.Value)
{
row1[
4] = row[3].ToString();
}
else
{
row1[
4] = row1[4].ToString() + ";" + row[3].ToString();
}

removeRows.Add(row);
//将这一行加入要删除的行列表中
}
else
{
dict.Add(key, row);
}
}

//删除重复的行
foreach (DataRow row in removeRows)
{
table.Rows.Remove(row);
}

}

 

eaglet | 园豆:17139 (专家六级) | 2010-06-21 08:02
0

同上楼

云锋 | 园豆:270 (菜鸟二级) | 2010-06-29 10:14
0

先查出前三列构建一个 DataTable
最后查出第一列和最后一列构建一个 DataTable
循环对比把结果拿出来

leon382 | 园豆:226 (菜鸟二级) | 2010-07-01 09:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册