繁体   English   中英

datatable.Rows.Cast之间的区别 <DataRow> Linq C中的和datatable.AsEnumerable()#

[英]Difference between datatable.Rows.Cast<DataRow> and datatable.AsEnumerable() in Linq C#

我正在研究与数据相关的数据表相关操作,在数据表上使用linq的最有效方法是什么 -

var list = dataSet.Tables[0]
  .AsEnumerable()
  .Where(p => p.Field<String>("EmployeeName") == "Jams");

要么

var listobj =  (EnumerableRowCollection<DataRow>) dataSet.Tables[0].Rows
  .Cast<DataRow>()
  .Where(dr => dr["EmployeeName"].ToString() == "Jams");

.AsEnumerable()内部使用.Rows.Cast<DataRow>() ,至少在参考实现中 它还会执行其他一些操作,但不会对性能造成任何影响。

.AsEnumerable().Field做了很多未在大多数情况下,需要额外的工作。

此外,通过索引进行字段查找比按名称查找更快:

int columnIndex = dataTable.Columns["EmployeeName"].Ordinal;

var list = dataTable.Rows.Cast<DataRow>().Where(dr => "Jams".Equals(dr[columnIndex])); 

对于多个名称,如果结果缓存在DictionaryLookup ,则查找速度更快:

int colIndex = dataTable.Columns["EmployeeName"].Ordinal;

var lookup = dataTable.Rows.Cast<DataRow>().ToLookup(dr => dr[colIndex]?.ToString());

// .. and later when the result is needed:
var list = lookup["Jams"];

定义“有效”。

从性能的角度来看,我怀疑这两个选项之间存在任何显着差异:总体运行时间将由执行网络I / O所需的时间决定,而不是执行转换所需的时间。

从纯粹的代码风格来看,第二个看起来对我来说太不优雅了。 如果您可以使用全LINQ解决方案,那么请使用它,因为它通常(IMO,至少)因为声明性而更具可读性。

有趣的是, AsEnumerable()返回EnumerableRowCollection<DataRow> ,如果您查看此代码,您将看到以下内容:

this._enumerableRows = Enumerable.Cast<TRow>((IEnumerable) table.Rows);

所以我会说它们基本相同!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM