首页 > 解决方案 > 从对象列表中创建具有指定名称、路径和格式的文件

问题描述

我需要在我的机器上创建一堆文件,目前我有一个类型的对象列表,FileInfo其中包含我需要创建的文件的名称、路径和格式。

解决此问题的最佳方法是什么?我正在考虑使用foreach循环,但我的列表中有超过 700000 个对象,我不确定这是否是最佳选择。

这是我用来用对象填充列表的函数:

 public static  List<FileInfo> ReturnFileFromDBInfo()
            {
                var result = new List<FileInfo>();
                SqlConnection conn = new SqlConnection();

                conn.ConnectionString = @"data source = MYPC\SQLEXPRESS; database = MYDB; integrated security = TRUE";
                conn.Open();
                var query = "SELECT a.partNumber, b.fullPath,a.fileType,a.baseID FROM drawings a ,bases_bases b WHERE a.baseID = b.id";
                var cmd = new SqlCommand(query, conn);
                SqlDataReader dataReader = cmd.ExecuteReader();
                while (dataReader.Read())
                {
                   result.Add ( new FileInfo()
                   {
                       partNumber = dataReader["partNumber"].ToString(),
                       path = dataReader["fullPath"].ToString(),
                       fileType = dataReader["fileType"].ToString(),
                       baseID = dataReader["baseID"].ToString(),
                   });
                }

                return result;
            }

它只是一个简单的查询,从 sql-server 数据库中检索文件名、路径和格式

标签: c#.netsql-server

解决方案


创建一个包含 700000 个对象的列表会占用大量内存并且速度相对较慢。我建议您不要返回列表,而是返回 IEnumerable,如下所示:

public static IEnumerable<FileInfo> ReturnFileFromDBInfo()
{
    var result = new List<FileInfo>();
    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = @"data source = MYPC\SQLEXPRESS; database = MYDB; integrated security = TRUE";
        conn.Open();
        var query = "SELECT a.partNumber, b.fullPath,a.fileType,a.baseID FROM drawings a ,bases_bases b WHERE a.baseID = b.id";
        using (var cmd = new SqlCommand(query, conn))
        using (SqlDataReader dataReader = cmd.ExecuteReader())
        {
            while (dataReader.Read())
            {
               yield return new FileInfo()
               {
                   partNumber = dataReader["partNumber"].ToString(),
                   path = dataReader["fullPath"].ToString(),
                   fileType = dataReader["fileType"].ToString(),
                   baseID = dataReader["baseID"].ToString(),
               };
            }
        }
    }
}

这只会在您迭代 ReturnFileFromDBInfo 返回的结果时创建每个 FileInfo 对象:

foreach (var fileInfo in ReturnFileFromDBInfo())
{
    string fileName = fileInfo.ToString();
    // Create file etc.
}

推荐阅读