【问题标题】:How to select multiple columns from dataset into a string list with LinQ如何使用 LinQ 从数据集中选择多个列到字符串列表中
【发布时间】:2012-12-20 12:36:28
【问题描述】:

好的,现在下面的工作正常

     List<string> lstKnownMoves = dsAttacksTemp.Tables[0].Rows.
Cast<DataRow>().Select(r => r["Column1"].ToString()).ToList();

但我想让它像下面那样工作而不工作

     List<string> lstKnownMoves = dsAttacksTemp.Tables[0].Rows.
Cast<DataRow>().Select(r => r["Column1"].ToString(),r => r["Column2"].ToString(),r => r["Column3"].ToString()).ToList();

因此,我想将多列添加到列表中,而不是 1 个数据集数据行列。 我该怎么做?

【问题讨论】:

  • 你会得到一个字符串数组的列表。那是你要的吗?大概你想要一个包含多个字符串属性的对象列表,不是吗?
  • “不工作”不清楚。你能指望什么?你会得到什么?
  • 你能举个例子吗?
  • 检查@SWeko 答案。 SelectMany 正在解决我的问题。非常感谢。

标签: c# linq c#-4.0 multiple-columns


【解决方案1】:

如果您只是将字段的内容转储到列表中,则可以使用 SelectMany

List<string> lstKnownMoves = dsAttacksTemp.Tables[0].Rows
 .Cast<DataRow>()
 .SelectMany(r => new string[]{
                    r["Column1"].ToString(),
                    r["Column2"].ToString(),
                    r["Column3"].ToString()})
 .ToList();

但是,如果您想将字段提取到另一个对象中,您可以执行以下操作:

class KnownMove {
   public string Column1 {get; set;}
   public string Column2 {get; set;}
   public string Column3 {get; set;}
}

List<KnownMove > lstKnownMoves = dsAttacksTemp.Tables[0].Rows
 .Cast<DataRow>()
 .SelectMany(r => new KnownMove{
                    Column1 = r["Column1"].ToString(),
                    Column2 = r["Column2"].ToString(),
                    Column3 = r["Column3"].ToString()})
 .ToList();

【讨论】:

    【解决方案2】:

    我假设您想要一个包含多个字符串属性的对象列表,而不是字符串数组列表。

    List<object> lstKnownMoves = dsAttacksTemp.Tables[0].Rows.
    Cast<DataRow>().Select(r => new { 
     Col1 = r["Column1"].ToString(), 
     Col2 = r["Column2"].ToString(), 
     Col3 = r["Column3"].ToString()
    }).ToList();
    

    这样你会得到一个List&lt;T&gt;,其中T是一个具有3个字符串属性的匿名对象,即Col1Col2Col3。我想这就是你要的。

    【讨论】:

    • 感谢我在询问之前尝试过此操作但无法正常工作img707.imageshack.us/img707/5091/errorggn.png
    • 这不是List&lt;string&gt;,而是List&lt;object&gt;。请查看我的更新答案。
    • ye 但这并不能解决我的问题。目的。检查 SWeko 回答它工作得很好
    【解决方案3】:

    好吧,假设您希望能够单独访问每一列,您希望返回一个字符串数组。

     List<string[]> lstKnownMoves = dsAttacksTemp.Tables[0].Rows
                              .Cast<DataRow>().Select(r => new[] 
                                   { 
                                      r["Column1"].ToString(),  
                                      r["Column2"].ToString(), 
                                      r["Column3"].ToString() 
                                   }).ToList();
    

    那么对于每一行,可以通过索引获取一列的字符串值:

     foreach(var item in lstKnownMoves) 
          Console.WriteLine("Column1: {0} Column2: {1} Column3: {2}", item);
    

    如果您基本上想要一个列映射,并且不想创建一个类来充当所选答案中的元组,您可以使用List&lt;dynamic&gt;

     List<dynamic> lstKnownMoves = dsAttacksTemp.Tables[0].Rows
                              .Cast<DataRow>().Select(r => new 
                                   { 
                                      Column1 = r["Column1"].ToString(),  
                                      Column2 = r["Column2"].ToString(), 
                                      Column3 = r["Column3"].ToString() 
                                   }).ToList<dynamic>();
    
     foreach(var item in lstKnownMoves) 
          Console.WriteLine("Column1: {0} Column2: {1} Column3: {2}", 
              item.Column1, item.Column2, item.Column3);
    

    【讨论】:

    • 不,我不想单独访问每个。我想将这 3 列添加到列表中。谢谢。
    • 确实将三列添加到列表中。不清楚你在问什么。您要求List&lt;string&gt;,但除非您只是将所有三列串连起来(在我看来这完全没用),否则您无法获取每一行的每一列,除非您从@987654326 更改列表元素@ 到 string[](或类似的)。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多