用linq取出foreach

时间:2010-06-21 21:10:05

标签: c# linq

有没有办法在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);
        }
    }

4 个答案:

答案 0 :(得分:5)

我没有把所有内容都塞进一行lambda,而是更喜欢可读性而不是节省行空间:

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

答案 1 :(得分: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:)

答案 2 :(得分: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"])));

答案 3 :(得分:1)

你可以使用这样的东西

 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作为下拉列表的数据源。