p.c*_*ell 12 c# linq asp.net ienumerable webforms
考虑下面的当前算法迭代GridView一行的行来查找是否Checkbox选中/检查了包含的内容.
List<int> checkedIDs = new List<int>();
foreach (GridViewRow msgRow in messagesGrid.Rows)
{
CheckBox chk = (CheckBox)msgRow.FindControl("chkUpdateStatus");
if (chk.Checked){
//we want the GridViewRow's DataKey value
checkedMsgIDs.Add(int.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString()));
}
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作:你留下了一个完全填充List<int>.
问题:您如何使用LINQ重新编写或改进此算法以搜索GridView已Checkbox选择/检查过的所有行?
lc.*_*lc. 20
我敢肯定你不会从此获得任何性能改进,但它可能会使它稍微更易于阅读:
var checkedIDs = from GridViewRow msgRow in messagesGrid.Rows
where ((CheckBox)msgRow.FindControl("chkUpdateStatus")).Checked
select Int32.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString());
Run Code Online (Sandbox Code Playgroud)
再次,不确定它是否有所作为.另外,为什么要转换为字符串然后转换为int?有什么东西Convert.ToInt32不能帮你吗?
我不确定行是否是IEnumerable它们可能不是,但我会假设它们是
List<int> checkedIDs = messagesGrid.Rows
.Where<GridViewRow>(i => (CheckBox)i.FindControl("chkUpdateStatus").Checked)
.Select<GridViewRow, int>(i => return int.Parse(messagesGrid.DataKeys[i.RowIndex].Value.ToString()))
.ToList<int>();
Run Code Online (Sandbox Code Playgroud)
我只是在记事本中这样做,那里可能存在编译错误.但这就是你如何用Linq做同样的事情.