c# - IEnumerable<string> 和 string[]

标签 c# .net-4.0

使用这个有什么好处吗

 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/

相关文章:

parsing - BigInteger.Parse() 对十六进制数给出负数

asp.net-mvc - MVC3 EF4 POCO 存储库/UnitOfWork 连接错误

c# - 在文件被删除之前访问文件

c# - 使用一个 SqlDataAdapter 运行多个存储过程

java - 使用 Java 加载 .NET 4.5 可执行文件

c# - WPF:GridViewColumn 调整大小事件

c# - 从另一个应用程序 C# 中读取列表框内容

c# - ComboBox 更改元素的顺序

c# - 使用 C# 进行动态 SQL Server 访问的建议

c# - .NET 4 中的比较器<T>.Create