使用这个有什么好处吗
private static IEnumerable<string> GetColumnNames(this IDataReader reader)
{
for (int i = 0; i < reader.FieldCount; i++)
yield return reader.GetName(i);
}
而不是这个
private static string[] GetColumnNames(this IDataReader reader)
{
var columnNames = new string[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
columnNames[i] = reader.GetName(i);
return columnNames;
}
下面是我如何使用这个方法
int orderId = _noOrdinal;
IEnumerable<string> columnNames = reader.GetColumnNames();
if (columnNames.Contains("OrderId"))
orderId = reader.GetOrdinal("OrderId");
while (reader.Read())
yield return new BEContractB2CService
{
//..................
Order = new BEOrder
{ Id = orderId == _noOrdinal ?
Guid.Empty : reader.GetGuid(orderId)
},
//............................
最佳答案
这两种方法截然不同,因此这取决于您随后将如何处理我要说的结果。
例如:
第一种情况要求数据读取器在读取结果之前保持打开状态,第二种情况则不需要。那么您打算将此结果保存多长时间,您是否希望让数据读取器打开那么长时间。
如果您肯定要读取数据,第一种情况的性能会较低,但如果您经常不这样做,则性能可能会更高,尤其是在有大量数据的情况下。
第一个案例的结果应该只被读取/迭代/搜索一次。然后可以多次存储和搜索第二个案例。
如果您有大量数据,那么可以使用第一种情况,这样您就不需要一次将所有数据都存入内存。但这同样取决于您在调用方法中对 IEnumerable 执行的操作。
编辑: 鉴于您的用例,这些方法对于任何给定的“良好”度量可能几乎是等效的。表格往往不会有很多列,您使用 .Contains 可确保每次都读取数据。就个人而言,我会在这里坚持使用数组方法,只是因为它是一种更直接的方法。
代码的下一行是什么……是在寻找不同的列名吗?如果是这样,第二种情况是唯一的出路。
关于c# - IEnumerable<string> 和 string[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6226692/