如何获得行号?

时间:2014-11-25 12:29:00

标签: c# .net datatable row indexof

我有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中获取行号?

感谢。

1 个答案:

答案 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);
    }
}

它显然有点冗长,但恕我直言,在这种情况下它是值得的,因为它在自然组织中处理数据(即表格自然是有列的行,而不是到有行的列。)