【问题标题】:Filter DataTable Efficiently高效过滤数据表
【发布时间】:2011-12-21 21:03:53
【问题描述】:

在 DataTable 中过滤 DataRows 的最有效方法是什么?我有一个整数列表,想要检索与列表中的整数匹配的所有行(并最终从中创建一个 DataTable)。我目前正在使用下面的代码,但速度很慢。我错过了更有效的方法吗?

foreach (var i in integerlist)
{
     DataRow dr = (from row in originalDataTable.AsEnumerable()
                   where row.Field<int>("urlID") == i
                   select row).FirstOrDefault<DataRow>();

     if (dr!= null)
     {
          newDataTable.Rows.Add(dr);
     }
}

【问题讨论】:

标签: c# linq filter datatable datarow


【解决方案1】:

我建议你反之亦然。

foreach (var row in originalDataTable)
{

    if(integerList.Contains( (int)row["urlID"]))
       newDataTable.ImportRow(row)
}

如果数据集中的行数多于 int 集合中的整数,则更有意义。 希望对你有帮助:)

【讨论】:

  • 谢谢。我尝试了代码,但不得不将newDataTable.Add(row) 更改为newDataTable.Rows.Add(row),因为没有Add 方法。但是当我运行它时,我收到了这个错误This row already belongs to another table.
  • 对不起,这只是一个sn-p。您必须调用 newDataTable.ImportRow(row)
【解决方案2】:

嗯...可能我错过了什么,但是...

使用DataView 并为其申请RowFilter 不是更容易吗?

【讨论】:

  • 我也在想同样的事情......不过,我认为@Elastep 的回答更多的是解决原始问题。不过好点!
  • o6tech:不清楚您引用的代码有什么好处。如果需要,您可以从过滤的 DataView 创建一个 new DataTable。我个人怀疑 OP 真的需要一个新的 DataTable。
  • 谢谢,我看看能不能用这个。不过我确实需要一个 DataTable,因为它被放置在 SQL Server 数据库中,并且我需要 DT 格式的数据。
【解决方案3】:

您可以尝试进行连接,例如:

var resultSet = 
from row in originalDataTable.AsEnumerable()
join i in integerlist
on row.Field<int>("urlID") equals i
select row;

这应该会给你完整的结果集。 如果你需要一个数据表,你可以这样做:

resultSet.CopyToDataTable();

【讨论】:

  • 我在select 上收到expected contextual keywords equals 错误。
  • 抱歉用 == 而不是等号,应该检查语法
【解决方案4】:

正如@Tigran 所说,您可以使用数据视图,请查看this msdn article 以了解如何实现这一点。

基本上您使用DataView 过滤数据,然后调用DataView.ToTable 方法来获取新的DataTable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多