C# 如何将Foreach循环转换为Linq(在datagridview中)

C# 如何将Foreach循环转换为Linq(在datagridview中),c#,asp.net,linq,C#,Asp.net,Linq,我尝试了以下操作,但出现了错误 林克: foreach (GridViewRow row in gridView.Rows) { // Access the CheckBox CheckBox cb = (CheckBox)row.FindControl("SuburbSelector"); if (cb.Checked) { //do something; } } var Str=SuburbGridView.Rows.Cast()。其中(r

我尝试了以下操作,但出现了错误

林克:

foreach (GridViewRow row in gridView.Rows)
{ // Access the CheckBox 
    CheckBox cb = (CheckBox)row.FindControl("SuburbSelector");
    if (cb.Checked)
    {
        //do something;
    }
}
var Str=SuburbGridView.Rows.Cast()。其中(r=>(复选框)r.FindControl(“SuburbSelector”)==checked);
错误:

委托“System.Func”不接受1个参数


非常感谢

您需要的是
而不是
=
结尾:

var Str = SuburbGridView.Rows.Cast<GridViewRow>().Where(r=>(CheckBox)r.FindControl("SuburbSelector")==checked);
var Str=SuburbGridView.Rows.Cast()
其中(r=>((复选框)r.FindControl(“郊区选择器”))。选中);

我不能确定这是唯一的错误,因为您没有指出您遇到了什么错误。

我认为这应该可以:

var Str = SuburbGridView.Rows.Cast<GridViewRow>()
          .Where(r=>((CheckBox)r.FindControl("SuburbSelector")).checked);
var result=SuburbGridView.Rows.Cast()。其中(r=>((复选框)r.FindControl(“SuburbSelector”)。选中);

您遇到了什么错误?

Linq似乎没有一个好的“每个”聚合。有一个
Aggregate()
,如果我没有实际积累任何东西,我就不喜欢它,因为累加器值基本上被丢弃了。我认为没有任何东西可以与
List.ForEach()
等同,这是一种耻辱。如果您使用的是C#4.0,并且不介意并行处理,那么可以使用
.aspallel().ForAll()
。总之,这里有一些方法可以满足您的需求:

使用
List.ForEach()

由于操作顺序的原因,这不起作用。选中的
.Checked
在转换为
复选框之前进行评估,这意味着您正试图访问
控件的
复选框
属性,但该属性不存在。额外的一对帕伦解决了这个问题

// Doesn't work
(CheckBox)row.FindControl("someCheckbox").Checked

最后一件事,在比较中不需要做
==true
<代码>已选中
已经是布尔值。如果你为了清晰而喜欢它(有些人喜欢),那就一定要保留它。这并不被认为是不好的做法或任何东西,这只是一个偏好问题。

Delegate'System.Func'不接受1个参数。如果您需要cast SuburbGridView.Rows.cast(),行不是已经可以计算了吗?此外,您还应该注意FindControl返回时的null或控件命名错误时的静态强制转换异常。不幸的是,
GridView.Rows
的类型是
GridViewRowCollection
,它只实现
IEnumerable
(非泛型),而不是
IEnumerable
,因此无法自动计算类型参数。
SuburbGridView.Rows.Cast<GridViewRow>().Where(
    r => ((CheckBox)r.FindControl("SuburbSelector")).Checked).ToList().ForEach(row =>
{
    Response.Write(row.ID);
    // Do something
});
SuburbGridView.Rows.Cast<GridViewRow>().Where(
    r => ((CheckBox)r.FindControl("SuburbSelector")).Checked).AsParallel().ForAll(row =>
{
    Response.Write(row.ID);
    // Do something
});
// Doesn't work
(CheckBox)row.FindControl("someCheckbox").Checked
// Works
((CheckBox)row.FindControl("someCheckbox")).Checked