不明白Except方法的使用在DataTable里没有用?

hjx398 2009-01-13 11:57:37

DataTable dt = new DataTable();

dt.Columns.Add("c1");
dt.Rows.Add(1);
dt.Rows.Add(2);
dt.Rows.Add(3);

DataTable dt2 = new DataTable();
dt2.Columns.Add("c1");
dt2.Rows.Add(2);

var query = dt.AsEnumerable().Except(dt2.AsEnumerable());
foreach (var w in query)
{
Response.Write(w.Field<string>("c1") + "<br>");
}
/*
结果:
1
2
3
为什么不是:
1
3
*/
Response.Write("<hr>");
List<string> l = new List<string>();
l.Add("1");
l.Add("2");
l.Add("3");
List<string> l2 = new List<string>();
l.Add("2");

var query2 = l.Except(l2);
foreach (var w in query2)
{
Response.Write(w + "<br>");
}
/*结果是:
1
3
*/
为什么这个又是正确的呢?
...全文
455 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjx398 2009-01-13
  • 打赏
  • 举报
回复

修改如下后得到了正确的结果,原来linq也不能自动对比集合.
var query = (from w in dt.AsEnumerable()
select w.Field<string>("c1")).Except(from w in dt2.AsEnumerable() select w.Field<string>("c1"));
foreach (var w in query)
{
Response.Write(w + "<br>");
}
raozhiven 2009-01-13
  • 打赏
  • 举报
回复
Except应该是通过HashCode来进行比较,从而排除满足条件的数据。两个不同DataTable实例中的DataRow,其HashCode当然不一样。
zgke 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 patrickpan 的回复:]
你判断一下:dt.rows[1] == dt2.rows[0],看结果是否相等。
然后再判断:l[1] == l2[0],看结果是否相等。

若没有用代码实验,但相信第一个结果应该是:false,第而个结果是:true。

现在知道答案了吧。
[/Quote]

学习~~~~
patrickpan 2009-01-13
  • 打赏
  • 举报
回复
你判断一下:dt.rows[1] == dt2.rows[0],看结果是否相等。
然后再判断:l[1] == l2[0],看结果是否相等。

若没有用代码实验,但相信第一个结果应该是:false,第而个结果是:true。

现在知道答案了吧。

111,131

社区成员

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

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

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