我有一个简单的数据表:
DataTable dt = new DataTable("myTable");
dt.Columns.Add("id", typeof (int));
dt.Columns.Add("John_a", typeof (int));
dt.Columns.Add("Paul_a", typeof (int));
dt.Columns.Add("George_b", typeof (int));
dt.Columns.Add("Ringo_b", typeof (int));
dt.Columns.Add("Yoko_a", typeof (int));
Run Code Online (Sandbox Code Playgroud)
它有一行数据:
DataRow r = dt.NewRow();
r["id"] = 1;
r["John_a"] = 0;
r["Paul_a"] = 0;
r["George_b"] =4;
r["Ringo_b"] = 2;
r["Yoko_a"] =10;
dt.Rows.Add(r);
Run Code Online (Sandbox Code Playgroud)
我只需要得到一个bool答案(真实):
上栏的所有值,其名称结尾与"_a"具有价值0
所以在这里,我应该得到False.为什么?
监守
John_a has 0
Paul_a has 0
Run Code Online (Sandbox Code Playgroud)
但
"Yoko_a"(也以...结尾"_a")没有"0"而是另一个数字.
我试过了什么:
var t =
dt.AsEnumerable().Select(row => dt.Columns.Cast<DataColumn>()
.Where(c => c.ColumnName.ToLower().EndsWith("_a")
&& row.Field<int>(c.ColumnName) == 0
)
).Any();
Run Code Online (Sandbox Code Playgroud)
但它返回True....
我错过了什么?
顾名思义,使用Enumerable.All:
bool allZero = dt.Columns.Cast<DataColumn>()
.Where(c => c.ColumnName.EndsWith("_a", StringComparison.OrdinalIgnoreCase))
.All(c => dt.AsEnumerable().All(r => r.Field<int>(c) == 0));
Run Code Online (Sandbox Code Playgroud)
请注意,这种方法也检查了所有行DataTable,我已经假设这是你想要的.一旦比较Enumerable.All返回false,就返回false.
编辑
我只需要检查第一行.
然后它更容易:
bool allZero = dt.Columns.Cast<DataColumn>()
.Where(c => c.ColumnName.EndsWith("_a", StringComparison.OrdinalIgnoreCase))
.All(c => dt.Rows[0].Field<int>(c) == 0);
Run Code Online (Sandbox Code Playgroud)