LINQ 未正确执行
本文关键字:执行 LINQ | 更新日期: 2023-09-27 18:33:16
我有这段代码:
DataTable dtDataTable = …;
var rows = dtDataTable.AsEnumerable();
var test = rows.Select(x => x["id"]).Distinct().Count() != rows.Count();
if (test)
{
MessageBox.Show("test");
return false;
}
问题:如果 test 应该为 true,则不会执行 if
语句中的代码。我似乎无法调试它(它只是继续运行我的代码(。
我认为它可能必须与延迟/立即执行有关,但我找不到解决方案(我已经尝试在select
后添加.ToList()
(。
有什么想法吗?
>首先,我认为Dictinct
会通过引用进行比较,因为DataRow
索引器返回的是Object
而不是int
。所以我建议使用强类型Field
扩展方法。但这不是您问题的原因。
因此,在您不知道原因之前,我建议您采用不同的(更有效的(方法来检查所有ID是否都是唯一的:
var ids = rows.Select(r => r.Field<int>("ID"));
var duplicateIdChecker = new HashSet<int>();
bool isIdUnique = ids.All(duplicateIdChecker.Add);
使用一些测试数据尝试了您的代码,还为同一任务编写了我的代码,一切正常。所以我想 Id 没有正确比较
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("desc");
var dr = dt.NewRow();
dr[0] = 1;
dr[1] = "prova1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 1;
dr[1] = "prova2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "prova3";
dt.Rows.Add(dr);
var rows = dt.Rows.OfType<DataRow>();
var test = (rows.Select(row => row["id"]).Distinct().Count() != rows.Count());
Console.WriteLine(test);
var rows1 = dt.AsEnumerable();
test = rows.Select(x => x["id"]).Distinct().Count() != rows.Count();
Console.WriteLine(test);