如何使用LinQ从数据集中选择多个列到字符串列表中

时间:2012-12-20 12:36:28

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

好的,现在这个正在运作

     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个数据集datarow列。 我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

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

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();

答案 1 :(得分:1)

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

 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<dynamic>

 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);

答案 2 :(得分:1)

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

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<T>,其中T是一个具有3个字符串属性的匿名对象,即Col1Col2Col3。我想这就是你要求的。