2010-06-21 47 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