LINQ未正确执行

时间:2014-12-04 13:34:45

标签: c# linq

我有这段代码:

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

有什么想法吗?

2 个答案:

答案 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);