2012-08-06 30 views
2

類:簡化我的C#Linq語句?

class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

列表

List<Foo> lst = new List<Foo>(); 

數據表:

DataTable dt = GetFromDb().... 

我想從dt與記錄填寫lst

我已經成功做:

Array.ForEach(dt.AsEnumerable().ToArray(), y = > lst.Add(new Foo() 
{ 
    Id = int.Parse(y["id"].ToString()), Name = y["name"].ToString() 
})); 

問題:

  1. 我能不能做點別的類似dt.AsEnumerable().Select(_ => fill lst)

知道的選擇簽名(在這種情況下)的一部分,是Func<datarow,void>這不會編譯

但儘管如此,有沒有這樣做的這個除了的醜陋的方式的其他方式我的?

回答

7

使用LINQ to DataSet

var foos = from row in dt.AsEnumerable() 
      select new Foo() 
      { 
       Id = row.Field<int>("id"), 
       Name = row.Field<string>("name") 
      }; 

// create a new list 
List<Foo> lst = foos.ToList(); 

// update: add items to an exisiting list 
fooList.AddRange(foos); 
4

你是在正確的軌道上,你可以做到以下幾點:

lst = dt.AsEnumerable().Select(y = > new Foo() 
{ 
    Id = Convert.ToInt32(y["id"]), Name = y["name"] as string 
}).ToList(); 

編輯:要添加到現有列表

我通常只連接兩個列表:

lst = lst.Concat(dt.AsEnumerable().Select(...)).ToList(); 

但是看到ken2k的回答,我想我現在開始用AddRange代替。

+0

不錯。如果我想將項目添加到現有列表中,該怎麼辦? (沒有問 - 我知道) – 2012-08-06 15:31:49

+0

你必須對列表進行foreach。 Linq是一種用於獲取數據的查詢語言,它不適合在查詢內處理。 – Kaido 2012-08-06 15:40:30

2

你可以這樣做:

List<Foo> lst = dt.AsEnumerable().Select(z => new Foo 
{ 
    Id = int.Parse(z["id"].ToString()), 
    Name = z["name"].ToString() 
}).ToList(); 

編輯:

如果要附加到現有List<Foo>實例:

lst.AddRange(dt.AsEnumerable().Select(z => new Foo 
{ 
    Id = int.Parse(z["id"].ToString()), 
    Name = z["name"].ToString() 
})); 
+0

爲什麼我的答案被低估?對於逆流而言:至少你可以解釋**爲什麼** ... – ken2k 2012-08-06 16:50:38

7

試試這個

var fooList = (from t in dt.AsEnumerable() 
     select new Foo { Id = t.Field<int>("Id"), 
          Name= t.Field<string>("Name") }).ToList(); 

AsEnumerable DataTable上的擴展方法將返回DataRows集合。那麼你可以從你的Linq Result和必要的字段中進行投影。由於它是dataRow類型,所以您需要指定每種列的類型。

+2

+1適用於'Field'的漂亮使用。 – 2012-08-06 15:31:23

1

我通過行物業另一種解決方案:

List<Foo> results = (from DataRow myRow in dt.Rows 
           select new Foo() 
          { 
           Id =int.Parse(row["id"].ToString()), 
           Name = row["name"].ToString() 
          }).ToList();