如何在 C# 中将 List<DataRow> 转换为 List<T>?

Posted

技术标签:

【中文标题】如何在 C# 中将 List<DataRow> 转换为 List<T>?【英文标题】:How to convert List<DataRow> to List<T> in C#? 【发布时间】:2016-06-06 20:25:07 【问题描述】:

如何将DataTable.Rows 集合转换为List&lt;Category&gt;

我想将数据行的值列表的值设置为 C# 对象的值列表,如下面的代码中所述。好心的建议。

UserData objUserData = null;
DataTable dtUserData = DataAccess.getUserDataTable();  
if(dtUserData.Rows.Count>0)

    foreach(DataRow dr in dtUserData.Rows)
    
      objUSerData = new UserData();
      List<objUSerData.Category> = Convert.ToString(List<dr["category"]>);
     

这是Category 类:

[DataContract]
public class category  get; set; 

  public string category_id get; set;
  public string category_name get; set;

【问题讨论】:

List&lt;objUSerData.Category&gt; = Convert.ToString(List&lt;dr["category"]&gt;); 无论如何都是无效的。您能否向我们展示您实际使用的可编译代码?或者,这是为了展示您希望实现的目标吗? 这就是我所说的一段奇怪的代码。它应该做什么?例如。 Convert.ToString(List&lt;dr["category"&gt;)?? @StefanSteinegger 我有一个从数据行中获取的类别集合,我如何在代码中提及语法正确?所以我在那里放了一个大概的代码。我坚持在那里完成语法。 @theB 我有一个从数据行中获取的类别集合,我如何在代码中提及语法正确?所以我在那里放了一个大概的代码。我坚持在那里完成语法。 好的,所以该行试图显示您想要做什么,但不确定?也许您可以在描述问题的代码块上方添加几句话,然后在代码中添加注释,以便我们知道这就是您的意图。 【参考方案1】:

只是猜测:

您可能希望从您的行创建 UserData:

foreach(DataRow dr in dtUserData.Rows)

   var userData = new UserData();
   // create an array with a single element
   userData.Categories = new [] 
   
     new Category
     
       category_id = ??,
       category_name = Convert.ToString(dr["category"])
     
   ;
   // not sure about this:
   userData.UserDetails = new [] 
   
     new UserDetails
     
       Whatever = Convert.ToString(dr["userdetails"]),
     
   ;

其实我也不知道dr["userdetails"]是什么类型。

可能您需要将行映射到实体。这些实体可能在另一个数据库中找到。该类别可能已经在那里找到,如果没有,则可能需要创建它。如果是这样,一切都会复杂得多。

用户数据很可能是更复杂的记录,我不知道行中的字段后面是什么。

因为问题中没有更多信息,我只能猜测。

【讨论】:

UserData 是我的域模型,其中包括多个列表,如类别、用户详细信息,那么我该如何处理呢? 在你的例子中,userData对象categorylist之间没有关系吗? @user6410893:你想用这些列表做什么? 我想将数据行转换为我的 c# 对象,并将输出作为 json 返回给使用该服务的客户。 您不能查询 DataTable 的 Rows 集合,因为 DataRowCollection 没有实现 IEnumerable。您需要对 DataTable 使用 AsEnumerable() 扩展 - 来自线程 ***.com/questions/10855/…【参考方案2】:

您可以使用 linq 或循环创建 category 类的实例:

DataTable dtUserData = DataAccess.getUserDataTable();
var list = dtUserData.Rows.Cast<DataRow>()
                     .Select(row => new category()
                     
                         category_id = row.Filed<string>("category_id"),
                         category_name = row.Filed<string>("category_name"),
                     ).ToList();

相当于:

var list = new List<category>();
foreach(DataRow row in dtUserData.Rows)

    list.Add(new category()
        
            category_id = row.Filed<string>("category_id"),
            category_name = row.Filed<string>("category_name"),
        );

【讨论】:

以上是关于如何在 C# 中将 List<DataRow> 转换为 List<T>?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 List<object> 转换为 Hashtable?

如何在 C# 中将 List<byte> 转换为 byte[]?

如何在 .NET 6 / C# 10 中将 List<String?> 转换为 List<String>?

如何在 C# 中将 IEnumerable<T> 转换为 List<T>?

C# list<>根据对象的某个属性排序

如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?