IEnumerable<;字符串>;和字符串[]
本文关键字:字符串 gt IEnumerable lt | 更新日期: 2023-09-27 17:58:16
使用这个有什么好处吗
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的使用可以确保每次都读取数据。就我个人而言,我会坚持这里的数组方法,哪怕只是因为它是一种更直接的方法。
代码的下一行是什么。。。它在寻找不同的列名吗?如果是这样的话,第二种情况是唯一的选择。
我脑海中浮现的原因:数组版本意味着你必须先花时间构建数组。大多数代码的客户端可能不一定需要特定的数组。我发现,大多数情况下,大多数代码都会对其进行迭代,在这种情况下,为什么要浪费时间来构建一个你从未真正需要的数组(或列表作为替代方案)呢。
第一个是懒惰。也就是说,在迭代枚举之前不会对代码求值,因为使用了闭包,所以它将运行代码,直到它产生一个值,然后将控制权转回调用代码,直到通过MoveNext
迭代到下一个值。此外,使用linq,您可以通过调用第一个,然后调用ToArray
来实现第二个。您可能想要这样做的原因是,确保在进行调用时和迭代时获得的数据是原样的,以防值在两者之间发生变化。
一个优点与内存消耗有关。如果FieldCount是100万,那么后者需要分配一个包含100万条目的数组,而前者则不需要。
不过,这一好处取决于该方法的使用方式。例如,如果您正在逐个处理文件列表,则无需预先了解所有文件。