我有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
中获取行号?
感谢。
答案 0 :(得分:0)
如果通过&#34;行号&#34;,表示Row
集合中Rows
对象的索引,那么您无法直接从{Row
集合获取该对象1}}对象。正如弗拉德的评论中所建议的那样,你可以使用类似的东西:
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--);
}
}
那就是说,在我看来,最好处理数据,这样你只能访问每一行。这至少应该改善数据局部性,并且在某些情况下可以显着提高性能。 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);
}
}
它显然有点冗长,但恕我直言,在这种情况下它是值得的,因为它在自然组织中处理数据(即表格自然是有列的行,而不是到有行的列。)