【问题标题】: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 中的行号?

谢谢。

【问题讨论】:

  • 您是否正在查找基于数据表中的某些行号?
  • 使用for代替扩展方法All

标签: 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);
    }
}

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

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2015-10-04
    相关资源
    最近更新 更多