2010-06-21 52 views
2

有沒有辦法在linq中的下面的代碼中取出foreach,但是產生相同的輸出?拿出使用LINQ的foreach

DropDownList ddl = new DropDownList(); 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 
     if ((byte)row["ListTypeID"] == 0) 
     { 
      item = new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"].ToString(), row["ListID"].ToString())); 
      ddl.Items.Add(item); 
     } 
     else 
     { 
      item = new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"].ToString())); 
      ddl.Items.Add(item); 
     } 
    } 
+1

這比LINQ聲明更清楚做同等操作可能是... – 2010-06-21 21:22:59

+0

@Reed - 我完全不同意你。我發現LINQ/lambda在製作集合時更具表現力。像這種情況一樣。 – 2010-06-21 22:28:35

回答

5

而不是惡補所有成單行拉姆達的,我更喜歡在可讀性節省空間行:

ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
    { 
     var listText = row["ListText"]; 
     var listTypeId = (byte)row["ListTypeID"]; 
     var listId = row["ListID"]; 

     var format = listTypeId == 0 ? "{0}:{1}" : "{1}"; 
     var itemText = String.Format(format, listTypeID, listId); 

     return new ListItem(listText, itemText); 
    } 
    )); 
+0

不錯的做法.. – 2010-06-21 21:34:09

3
ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
(byte)row["ListTypeID"] == 0 
    ? new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"].ToString(), row["ListID"].ToString())) 
    : new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"].ToString()))   
)); 

有點清潔

ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
(byte)row["ListTypeID"] == 0 
    ? new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"], row["ListID"])) 
    : new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"]))   
)); 

休假的foreach :)

+0

亂七八糟... ^^ – 2010-06-21 21:14:34

+0

改變foreach選擇...不知道這個是多麼的好... – 2010-06-21 21:17:01

+0

在你的兩個建議 – Thea 2010-06-21 21:18:46

1

您可以使用somet hing like this

var Items= (from DataRow dr in ds.Tables[0].AsEnumerable() 
     select new { 
     Text=dr.Field<string>("ListText"), 
     Value =dr.Field<byte>("ListTypeID") == 0?string.Format("{0}:{1}", dr.Field<string>("ListTypeID"), dr.Field<string>("ListID")):string.Format("{0}", dr.Field<string>("ListID")) 
    }).ToList(); 

現在您可以使用Items作爲下拉菜單的數據源。

2

經過一番重新排序後,您可以實現以下目標 - 添加排除的項目。

var items = ds.Tables[0].Rows.Select(row => 
    new ListItem(row["ListText"].ToString(), 
       String.Format(
        (Byte)row["ListTypeID"] == 0 ? "{0}:{1}" : "{1}", 
        row["ListTypeID"], row["ListID"]))); 
+0

更好。通過刪除最後一個ToString(),你可以節省更多,String.Format將處理這個問題。 – 2010-06-21 21:32:47

+0

當然......我怎麼能忽略...... thx! – 2010-06-21 21:33:54