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()(。

有什么想法吗?

LINQ 未正确执行

>首先,我认为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);