首页 新闻 会员 周边

DataTable怎么移除指定字段的重复行。然后按另一字段排序

0
悬赏园豆:30 [已解决问题] 解决于 2013-02-28 18:10

现在有一个datatable,数据是这样的

action     date

aaaa       2012-2-3 12:11:22

bbbb      2012-2-1  11:22:32

aaaa       2012-2-1  10:22:22

 

我想得到的最终结果是

action     date

aaaa       2012-2-3 12:11:22

bbbb      2012-2-1  11:22:32

也就是去除action字段重复的并且保留最新时间的action,然后按照date排序,最新的在前

晨之风的主页 晨之风 | 菜鸟二级 | 园豆:373
提问于:2013-02-28 15:03
< >
分享
最佳答案
0

用Linq 先根据查询结果用时间排序,再用Linq的Distinct()方法对action重复值做过滤。给你个例子

DataTable dt=new DataTable();
dt.Columns.Add("action");
dt.Columns.Add("date");
dt.Columns["date"].DataType = typeof (DateTime);
DataRow dr = dt.NewRow();
dr["action"] = "aaaa";
dr["date"] =Convert.ToDateTime("2012-2-3 12:11:22");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["action"] = "bbbb";
dr["date"] = Convert.ToDateTime("2012-2-3 12:25:22");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["action"] = "aaaa";
dr["date"] = Convert.ToDateTime("2012-2-3 12:22:22");
dt.Rows.Add(dr);
var drs = (from data in dt.AsEnumerable() orderby data["date"] descending select data).Distinct(new DataRowCompare());//根据时间反序排序获取结果

foreach (DataRow dataRow in drs)
{
Console.WriteLine("{0}-{1}",dataRow["date"],dataRow["action"]);
}
Console.ReadLine();

}
//过滤条件,根据action过滤
public class DataRowCompare : IEqualityComparer<DataRow> 
{
public bool Equals(DataRow x, DataRow y)
{
return x["action"] == y["action"];
}

public int GetHashCode(DataRow obj)
{
return obj["action"].ToString().GetHashCode(); 
}
}
收获园豆:10
林J | 菜鸟二级 |园豆:202 | 2013-02-28 16:39
其他回答(4)
0

select  action,max(date)  date  from table group by action order by date desc

周大大 | 园豆:231 (菜鸟二级) | 2013-02-28 15:10

datatable 可以这样查询吗?

支持(0) 反对(0) 晨之风 | 园豆:373 (菜鸟二级) | 2013-02-28 15:12
0

呵呵。。。

小玩子 | 园豆:202 (菜鸟二级) | 2013-02-28 15:18
0

datatable没办法满足你的要求,你可以先转换成List,再用list来查,再转换回datatable

收获园豆:10
Rich.T | 园豆:3440 (老鸟四级) | 2013-02-28 15:24

能不能给演示一下啊?呵呵

支持(0) 反对(0) 晨之风 | 园豆:373 (菜鸟二级) | 2013-02-28 15:48
0

排序:

DataView dv = new DataView();
dv = dt.DefaultView;
dv.Sort = "date"; //排序
dt = dv.ToTable();

action的唯一性:

list<string> sameList=new list<string>();
for(int i=dt.Rows.count-1;i>=0;i--)
{
     DataRow row =dt.Rows[i];
     string action=row["action"].tostring();
     if(sameList.Contains(action))
          row.delete();
     else
         sameList.Add(action);
}
dt.AcceptChanges();
收获园豆:10
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-02-28 16:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册