Linq似乎没有一个好的“each”聚合函数。虽然有
Aggregate()
,但如果我实际上不累加任何东西,我就不喜欢它,因为累加器值基本上被抛弃了。我不认为有任何等效于
List<T>.ForEach()
的东西,这很遗憾。如果您使用C# 4.0,并且不介意并行处理,可以使用
.AsParallel().ForAll()
。所以,以下是几种实现您想要的方式:
使用
List.ForEach()
:
SuburbGridView.Rows.Cast<GridViewRow>().Where(
r => ((CheckBox)r.FindControl("SuburbSelector")).Checked).ToList().ForEach(row =>
{
Response.Write(row.ID);
});
并行Linq的使用:
SuburbGridView.Rows.Cast<GridViewRow>().Where(
r => ((CheckBox)r.FindControl("SuburbSelector")).Checked).AsParallel().ForAll(row =>
{
Response.Write(row.ID);
});
我刚刚开始掌握LINQ技术,我非常喜欢它。
顺便说一下,你只是忘记在强制类型转换时加上额外的一对()
。 FindControl()
返回一个System.Web.UI.Control
对象,你必须将其转换为CheckBox
才能访问Checked
属性。 你不能这样做:
// Doesn't work
(CheckBox)row.FindControl("someCheckbox").Checked
那样不起作用是因为操作顺序的问题。在转换为CheckBox
之前,.Checked
被评估,这意味着您正在尝试访问Control
的CheckBox
属性,而它不存在。多余的一对括号可以解决这个问题。
// Works
((CheckBox)row.FindControl("someCheckbox")).Checked
最后一件事,您在比较中不需要使用== true
。 Checked
已经是一个布尔值。如果您喜欢保留它以提高可读性(有些人确实这样做),那么请随意保留它。这并不被认为是不好的做法或者其他什么,这只是个人喜好的问题。
GridView.Rows
的类型是GridViewRowCollection
,它只实现了IEnumerable
(非泛型版本),而不是IEnumerable<GridViewRow>
,因此类型参数无法自动确定。 - Samuel Meacham