C# 将DataRowCollection转换为IEnumerable<;T>;

C# 将DataRowCollection转换为IEnumerable<;T>;,c#,.net,linq,.net-3.5,ienumerable,C#,.net,Linq,.net 3.5,Ienumerable,我想在.NET3.5中做类似的事情。最快的方法是什么 IEnumerable<DataRow> collection = TypedDataSet.TypedTableBase<DataRow>.Rows as IEnumerable<DataRow>; IEnumerable集合= TypedDataSet.TypedTableBase.Rows作为IEnumerable; 您可以调用数据行集合上的of type() 假设您使用的是引入协方差的.

我想在.NET3.5中做类似的事情。最快的方法是什么

IEnumerable<DataRow> collection = 
    TypedDataSet.TypedTableBase<DataRow>.Rows as IEnumerable<DataRow>;
IEnumerable集合=
TypedDataSet.TypedTableBase.Rows作为IEnumerable;

您可以调用
数据行集合上的
of type()

假设您使用的是引入协方差的.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;
//您的表可能是从TypedTableBase派生的某种类型,
//其中T是从DataRow派生的自动生成类型。
IEnumerable集合=myTypedTable;
实现
IEnumerable,其中T:DataRow

否则:

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

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

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

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

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

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

这是最简单的解决方案这与对DataRowCollection调用Cast()没有什么不同,后者已经在可接受的答案中。(除非我们正在梳理头发,我相信OfType会进行一些不必要的过滤,Cast不会介意这些过滤)@KevinHolt不,我想说它们是相同的,如果并且只有当您确定集合中唯一类型的对象可强制转换为DataRows。。。在DataRowCollection的情况下,这是正确的,但在大多数非泛型的
IEnumerable
s中,这肯定不是正确的。我不是说IEnumerable.OfType()和IEnumerable.Cast()总是对任何t和R执行相同的操作,我并不是想暗示这一点。然而,我是说(听起来你同意我的观点),在R=T的情况下,他们做同样的事情,比如OP的实际问题,我读到它是专门询问T=R=DataRow。这和wsanville的答案对我来说是相关的。当Cast发现无法转换为TResult的项时,它会抛出异常。另一方面,OfType只返回TResult类型的项。请参阅上的文档