我有DataTable ,我需要清除所有空列。 所以这是代码示例:
for (var i = 0; i < table.Columns.Count; i++) { if (table.Rows.Cast<DataRow>().All(r => string.IsNullOrWhiteSpace(r[i].ToStringOrNull()))) { table.Columns.RemoveAt(i--); } }问题:如何在If-statement获取行号?
谢谢。
I have DataTable and i need to clear all empty columns. So here is code example:
for (var i = 0; i < table.Columns.Count; i++) { if (table.Rows.Cast<DataRow>().All(r => string.IsNullOrWhiteSpace(r[i].ToStringOrNull()))) { table.Columns.RemoveAt(i--); } }Question : How can i get row Number in If-statement ?
Thanks.
最满意答案
如果通过“行号”表示Rows集合中Row对象的索引,则无法直接从Row对象获取该Row 。 你可以像弗拉德的评论中所建议的那样使用类似的东西:
for (var i = 0; i < table.Columns.Count; i++) { if (Enumerable.Range(0, table.Rows.Count).All( j => string.IsNullOrWhiteSpace(tables.Rows[j][i].ToStringOrNull()))) { table.Columns.RemoveAt(i--); } }也就是说,在我看来,处理数据会更好,只能访问每一行。 这至少应该改善数据局部性,并且在某些情况下可以显着提高性能。 例如:
bool[] keepColumn = new bool[table.Columns.Count]; for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { if (!keepColumn[j] && !string.IsNullOrWhiteSpace(table.Columns[j].ToStringOrNull())) { keepColumn[j] = true; } } } for (int i = table.Columns.Count - 1; i >= 0; i--) { if (!keepColumn[i]) { table.Columns.RemoveAt(i); } }它显然有点冗长,但恕我直言,在这种情况下它是值得的,因为它在自然组织中处理数据(即表自然是具有列的行,而不是具有行的列)。
If by "row number", you mean the index of a Row object in the Rows collection, then you can't get that directly from the Row object. You can, as suggested in Vlad's comment, use something like this instead:
for (var i = 0; i < table.Columns.Count; i++) { if (Enumerable.Range(0, table.Rows.Count).All( j => string.IsNullOrWhiteSpace(tables.Rows[j][i].ToStringOrNull()))) { table.Columns.RemoveAt(i--); } }That said, it seems to me that it would be better to process the data such that you visit each row only once. This should at the very least improve data locality, and in some scenarios could significantly improve performance. E.g.:
bool[] keepColumn = new bool[table.Columns.Count]; for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { if (!keepColumn[j] && !string.IsNullOrWhiteSpace(table.Columns[j].ToStringOrNull())) { keepColumn[j] = true; } } } for (int i = table.Columns.Count - 1; i >= 0; i--) { if (!keepColumn[i]) { table.Columns.RemoveAt(i); } }It's obviously a bit more verbose, but IMHO it would be worth it in this case, because it's processing the data in their natural organization (i.e. tables are naturally rows that have columns, as opposed to columns that have rows).
更多推荐
发布评论