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<;字符串>;和字符串[]

这两种方法非常不同,所以这取决于你接下来要对结果做什么。

例如:

第一种情况要求数据读取器在读取结果之前保持打开状态,而第二种情况则不然。那么,你将保持这个结果多久,你想让数据读取器打开那么长时间吗。

如果您肯定要读取数据,则第一种情况的性能较差,但如果您经常不读取数据,尤其是在有大量数据的情况下,则可能更具性能。

第一个案例的结果应该只读取/迭代/搜索一次。然后可以多次存储和搜索第二个案例。

如果你有大量的数据,那么第一种情况可以用这样一种方式使用,即你不需要一次把所有的数据都带到内存中。但同样,这实际上取决于如何处理调用方法中的IEnumerable。

编辑:考虑到您的用例,这些方法可能相当于任何给定的"良好性"度量。表往往没有太多列,而您对.Contains的使用可以确保每次都读取数据。就我个人而言,我会坚持这里的数组方法,哪怕只是因为它是一种更直接的方法。

代码的下一行是什么。。。它在寻找不同的列名吗?如果是这样的话,第二种情况是唯一的选择。

我脑海中浮现的原因:数组版本意味着你必须先花时间构建数组。大多数代码的客户端可能不一定需要特定的数组。我发现,大多数情况下,大多数代码都会对其进行迭代,在这种情况下,为什么要浪费时间来构建一个你从未真正需要的数组(或列表作为替代方案)呢。

第一个是懒惰。也就是说,在迭代枚举之前不会对代码求值,因为使用了闭包,所以它将运行代码,直到它产生一个值,然后将控制权转回调用代码,直到通过MoveNext迭代到下一个值。此外,使用linq,您可以通过调用第一个,然后调用ToArray来实现第二个。您可能想要这样做的原因是,确保在进行调用时和迭代时获得的数据是原样的,以防值在两者之间发生变化。

一个优点与内存消耗有关。如果FieldCount是100万,那么后者需要分配一个包含100万条目的数组,而前者则不需要。

不过,这一好处取决于该方法的使用方式。例如,如果您正在逐个处理文件列表,则无需预先了解所有文件。