如何去掉datatable中的重复行?

netboygg 2011-03-28 06:55:22
有一个gridview绑定的ds里的datatable中的数据时这样的:
列1 列2 列3
三分厂 44
二分厂 60
三分厂 80
二分厂 90

如果变为:

列1 列2 列3
三分厂 44 80
二分厂 60 90

不是从sql中查处来的,所以不能在sql中处理

谢谢
...全文
804 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
netboygg 2011-03-31
  • 打赏
  • 举报
回复
解决了,我是先将原有dt做个过滤重复处理,然后从列头和行值来进行区分,修改对应的值做到的
笑道江湖情 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wxr0323 的回复:]
引用 10 楼 netboygg 的回复:

不是行列转化的问题吧,我这个datatable不是从sql里直接能查出来的,中间处理过的,生成的它

那你取出来
遍历datatable 也可以

然后把相同列明的 后面的数据累加。
例如

lt.add("三分厂");

然后判断datatable是否有跟三分厂 名字一样的 如果有的话

在lt.add(40).

.……
[/Quote]
实现一下:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = this.GetDataTable();
GridView1.DataBind();
}
}

public DataTable GetDataTable()
{
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn("列1", typeof(string));
DataColumn dc2 = new DataColumn("列2", typeof(int));
DataColumn dc3 = new DataColumn("列3", typeof(int));
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Rows.Add("三分厂", 44, null);
dt.Rows.Add("二分厂", 60, null);
dt.Rows.Add("三分厂", null, 80);
dt.Rows.Add("二分厂", null, 90);
dt.Rows.Add("一分厂", null, 80);
dt.Rows.Add("二分厂", null, 90);
dt.Rows.Add("一分厂", 20, 30);
dt.Rows.Add("一分厂", 20, null);
dt.Rows.Add("四分厂", 120, null);
return dt;
}

/// <summary>
/// 处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
DataTable dt = this.GetDataTable();
DataTable newDt = dt.Clone();
List<string> nameList = new List<string>();
foreach (DataRow row in dt.Rows)
{
if (!nameList.Contains(row[0].ToString()))
{
nameList.Add(row[0].ToString());
DataRow newRow = newDt.NewRow();
newRow["列1"] = row[0].ToString();
newRow["列2"] = 0;
newRow["列3"] = 0;
newDt.Rows.Add(newRow);
}
}

foreach (DataRow newRow in newDt.Rows)
{
foreach (DataRow row in dt.Rows)
{
if (row["列1"].ToString() == newRow["列1"].ToString())
{
if (row["列2"] == DBNull.Value)
row["列2"] = 0;
if (row["列3"] == DBNull.Value)
row["列3"] = 0;
newRow["列2"] = Convert.ToInt32(newRow["列2"]) + Convert.ToInt32(row["列2"]);
newRow["列3"] = Convert.ToInt32(newRow["列3"]) + Convert.ToInt32(row["列3"]);
}
}
}
GridView1.DataSource = newDt;
GridView1.DataBind();
}
ycproc 2011-03-29
  • 打赏
  • 举报
回复
distinct 是去重复的函数

酱紫 不多说了 你自己揣摩一下
netboygg 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 malei45 的回复:]
循环输出时用IF判断一下 基本就能实现
[/Quote]

请问如何写?
malei45 2011-03-29
  • 打赏
  • 举报
回复
循环输出时用IF判断一下 基本就能实现
粗暴的香蕉 2011-03-29
  • 打赏
  • 举报
回复
可以考虑下使用Linq to DataSet
ztxneter 2011-03-29
  • 打赏
  • 举报
回复
至此,看错题意
ztxneter 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 netboygg 的回复:]

引用 6 楼 ztxneter 的回复:
你是怎么写的


我就是按照你的做法写的,但是依然是原样 ,没有改变
[/Quote]

贴出代码,贴出部分数据
8536105 2011-03-29
  • 打赏
  • 举报
回复
DataView 过滤、排序、DISTINCT功能http://blog.csdn.net/luols/archive/2010/04/28/5539573.aspx
netboygg 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 david_tao 的回复:]
那两个例子好像写死了吧?
[/Quote]

对的 是动态的列,几分厂几分厂那些列是动态增加的
david_tao 2011-03-29
  • 打赏
  • 举报
回复
那两个例子好像写死了吧?
codefighting 2011-03-28
  • 打赏
  • 举报
回复
顶之[Quote=引用 13 楼 dalmeeme 的回复:]
HTML code
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />



C# code
publi……
[/Quote]
机器人 2011-03-28
  • 打赏
  • 举报
回复
用 linq2DataTable 比较简单:

var data1 = new DataTable();
data1.Columns.Add("Col1");
data1.Columns.Add("Col2");
data1.Columns.Add("Col3");

data1.Rows.Add(new object[] { "三分厂", "44", "" });
data1.Rows.Add(new object[] { "二分厂", "60", "" });
data1.Rows.Add(new object[] { "三分厂", "", "80" });
data1.Rows.Add(new object[] { "二分厂", "", "90" });

var query = from row in data1.AsEnumerable()
group row by row.Field<string>(0)
into g
select new
{
key = g.Key,
col1 = string.Join(",", g.Where(t => t.Field<string>(1) != "").Select(t => t.Field<string>(1))),
col2 = string.Join(",", g.Where(t => t.Field<string>(2) != "").Select(t => t.Field<string>(2))),
};

foreach (var r in query)
Console.WriteLine(r);


输出:

{ key = 三分厂, col1 = 44, col2 = 80 }
{ key = 二分厂, col1 = 60, col2 = 90 }
dalmeeme 2011-03-28
  • 打赏
  • 举报
回复
		<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />


public partial class _Default : System.Web.UI.Page
{
private DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
dt = DbData.CreateNewTable("列1", "System.String", "列2", "System.String", "列3", "System.String");
dt.Rows.Add("三分厂", "44", null);
dt.Rows.Add("二分厂", "60", null);
dt.Rows.Add("三分厂", null, "80");
dt.Rows.Add("二分厂", null, "90");
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
DataTable resultDT = dt.Clone();
for (int i = 0; i < dt.Rows.Count; i++)
{
bool flag = false;
for (int j = 0; j < resultDT.Rows.Count; j++)
{
if (dt.Rows[i][0].ToString() == resultDT.Rows[j][0].ToString())
{
if (resultDT.Rows[j][1].ToString() == "")
resultDT.Rows[j][1] = dt.Rows[i][1].ToString();
if (resultDT.Rows[j][2].ToString() == "")
resultDT.Rows[j][2] = dt.Rows[i][2].ToString();
flag = true;
}
}
if (!flag)
resultDT.Rows.Add(dt.Rows[i][0], dt.Rows[i][1], dt.Rows[i][2]);
}
GridView1.DataSource = resultDT;
GridView1.DataBind();
}
}

说明:DbData.CreateNewTable方法是我的一个自定义类中的方法,作用是创建一个DataTable并定义表结构。
神码浮云 2011-03-28
  • 打赏
  • 举报
回复
能否遍历它, 判断是否存在相同的, 相同的就跳过, 重组datatable.
子夜__ 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 netboygg 的回复:]

不是行列转化的问题吧,我这个datatable不是从sql里直接能查出来的,中间处理过的,生成的它
[/Quote]
那你取出来
遍历datatable 也可以

然后把相同列明的 后面的数据累加。
例如

lt.add("三分厂");

然后判断datatable是否有跟三分厂 名字一样的 如果有的话

在lt.add(40).

....

最后绑定
netboygg 2011-03-28
  • 打赏
  • 举报
回复
不是行列转化的问题吧,我这个datatable不是从sql里直接能查出来的,中间处理过的,生成的它
子夜__ 2011-03-28
  • 打赏
  • 举报
回复
你这个是行专列 在加distinct.

参考
netboygg 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ztxneter 的回复:]
你是怎么写的
[/Quote]

我就是按照你的做法写的,但是依然是原样 ,没有改变
加载更多回复(7)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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