4

我有一个简单的数据表:

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

它有一行数据:

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

只有在以下情况下,我才需要得到bool答案(真):

名称以结尾的列上的所有值"_a"都有值0

所以在这里,我应该得到False。为什么 ?

因为

John_a has 0
Paul_a has 0

"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();

但它返回True....

我错过了什么?

4

1 回答 1

6

顾名思义,使用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));

请注意,这种方法还会检查 的所有行DataTable,我认为这就是您想要的。一个比较返回后立即Enumerable.All返回。falsefalse

编辑

我只需要检查第一行。

然后就更简单了:

bool allZero = dt.Columns.Cast<DataColumn>()
    .Where(c => c.ColumnName.EndsWith("_a", StringComparison.OrdinalIgnoreCase))
    .All(c => dt.Rows[0].Field<int>(c) == 0);
于 2013-07-16T15:39:02.930 回答