【问题标题】:How to get row number?如何获取行号?
【发布时间】:2014-11-25 12:28:59
【问题描述】:
我有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 中的行号?
谢谢。
【问题讨论】:
标签:
c#
.net
datatable
row
indexof
【解决方案1】:
如果“行号”是指Row 对象在Rows 集合中的索引,那么您不能直接从Row 对象中获取该索引。正如 Vlad 的评论中所建议的,您可以改用以下内容:
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);
}
}
这显然有点冗长,但恕我直言,在这种情况下这是值得的,因为它以自然的组织方式处理数据(即表自然是具有列的行,而不是具有行的列)。