有没有办法在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);
}
}
答案 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作为下拉列表的数据源。