将 DataRowCollection 转换为 IEnumerable<T>

Posted

技术标签:

【中文标题】将 DataRowCollection 转换为 IEnumerable<T>【英文标题】:Convert DataRowCollection to IEnumerable<T> 【发布时间】:2011-06-25 20:10:19 【问题描述】:

我想在 .NET 3.5 中做这样的事情。最快的方法是什么?

IEnumerable<DataRow> collection = 
    TypedDataSet.TypedTableBase<DataRow>.Rows as IEnumerable<DataRow>;

【问题讨论】:

【参考方案1】:

您可以在DataRowCollection 上致电OfType&lt;DataRow&gt;()

【讨论】:

这是最简单的解决方案 这实际上与在 DataRowCollection 上调用 Cast() 没有什么不同,后者已经在接受的答案中。 (除非我们要分叉,我相信 OfType 会进行一些 Cast 不会打扰的不必要的过滤) @KevinHolt 不,当且仅当您确定集合中唯一的对象类型可转换为 DataRows 时,我会说它们是相同的......在 DataRowCollection 的情况下,这是真的,但在大多数非泛型 IEnumerables 中绝对不是。 对,我并不是说 IEnumerable.OfType() 和 IEnumerable.Cast() 总是对任何 T 和 R 做同样的事情,并且我并不是要暗示这一点。但是,我是说(听起来你同意我的观点)他们在 R=T 的情况下做同样的事情,比如我读到的 OP 的实际问题是专门询问 T=R=DataRow。跨度> 【参考方案2】:

假设您使用的是 .NET 4.0,它引入了协方差:

// Presumably your table is of some type deriving from TypedTableBase<T>,
// where T is an auto-generated type deriving from DataRow.
IEnumerable<DataRow> collection = myTypedTable;

table type itself 实现了IEnumerable&lt;T&gt; where T : DataRow

否则:

IEnumerable<DataRow> collection = myTypedTable.Cast<DataRow>();

【讨论】:

这和 wsanville 的答案与我有关。碰巧 Cast 在找到无法转换为 TResult 的项目时会引发异常。另一方面,OfType 只返回 TResult 类型的项目。请参阅msdn.microsoft.com/en-us/library/bb360913(v=vs.110).aspx 上的文档【参考方案3】:

一个简单的直接解决方案是使用 System.Data.DataTable 对象的方法“Select()”,它会生成“DataRow[]”。从此,您可以使用 Linq 将其视为 IEnumberable,如下所示:

List<MyItem> items = dtItems.Select().Select(row => new MyItem(row)).ToList();

为每一行提供一个有用的对象列表。

【讨论】:

【参考方案4】:

如果您在项目中包含System.Data.DataSetExtensions.dll,则会有一个内置的扩展方法来添加AsEnumerable() 方法。

IEnumerable<DataRow> collection = TypedDataSet.TypedTableBase<DataRow>.AsEnumerable();

【讨论】:

以上是关于将 DataRowCollection 转换为 IEnumerable<T>的主要内容,如果未能解决你的问题,请参考以下文章

令人惊讶的性能差异:List.Contains、Sorted List.ContainsKey、DataRowCollection.Contains、Data Table.Select、DataTab

c# 中DataTable带条件的GroupBy写法怎么写?

将代码转换为 Neon 程序集

如何将for循环转换为map函数

如何将字符串转换为整型数?

将对象转换为数组