我有这段代码:
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
语句中的代码不会被执行。我似乎无法调试它(它只是继续运行我的代码)。
我认为可能需要对延迟/立即执行执行某些操作,但我找不到解决方案(我已尝试在.ToList()
之后添加select
。
有什么想法吗?
答案 0 :(得分:4)
首先我认为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);
答案 1 :(得分:1)
用一些测试数据尝试了你的代码,同时为同一个任务编写了我的代码,一切正常。所以我猜Ids没有正确比较
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);