如何将Foreach循环转换为Linq(在DataGridView中)

3
foreach (GridViewRow row in gridView.Rows)
{ // Access the CheckBox 
    CheckBox cb = (CheckBox)row.FindControl("SuburbSelector");
    if (cb.Checked)
    {
        //do something;
    }
}

我尝试了下面的代码,并遇到了错误:

Linq:

var Str = SuburbGridView.Rows.Cast<GridViewRow>().Where(r=>(CheckBox)r.FindControl("SuburbSelector")==checked);

错误:

委托“System.Func<System.Web.UI.WebControls.GridViewRow, int, bool>”不接受1个参数

非常感谢


你需要进行转换 SuburbGridView.Rows.Cast<GridViewRow>() 吗?Rows 不已经是 IEnumerable<GridViewRow> 吗?此外,从 FindControl 返回 null 或控件名称拼写错误会导致静态转换异常,需要小心处理。 - Preet Sangha
不幸的是,GridView.Rows 的类型是 GridViewRowCollection,它只实现了 IEnumerable(非泛型版本),而不是 IEnumerable<GridViewRow>,因此类型参数无法自动确定。 - Samuel Meacham
3个回答

3
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);
    // Do something
});

并行Linq的使用:

SuburbGridView.Rows.Cast<GridViewRow>().Where(
    r => ((CheckBox)r.FindControl("SuburbSelector")).Checked).AsParallel().ForAll(row =>
{
    Response.Write(row.ID);
    // Do something
});

我刚刚开始掌握LINQ技术,我非常喜欢它。

顺便说一下,你只是忘记在强制类型转换时加上额外的一对()FindControl()返回一个System.Web.UI.Control对象,你必须将其转换为CheckBox才能访问Checked属性。 你不能这样做:

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

那样不起作用是因为操作顺序的问题。在转换为CheckBox之前,.Checked被评估,这意味着您正在尝试访问ControlCheckBox属性,而它不存在。多余的一对括号可以解决这个问题。

// Works
((CheckBox)row.FindControl("someCheckbox")).Checked

最后一件事,您在比较中不需要使用== trueChecked已经是一个布尔值。如果您喜欢保留它以提高可读性(有些人确实这样做),那么请随意保留它。这并不被认为是不好的做法或者其他什么,这只是个人喜好的问题。


1

在代码末尾,你需要使用.而不是=

var Str = SuburbGridView.Rows.Cast<GridViewRow>()
          .Where(r=>((CheckBox)r.FindControl("SuburbSelector")).checked);

我不能确定那是唯一的错误,因为你没有指出你得到了什么错误。


1

我认为这应该可以工作:

var result = SuburbGridView.Rows.Cast<GridViewRow>().Where(r => ((CheckBox)r.FindControl("SuburbSelector")).Checked);

你遇到了什么错误?

委托“System.Func<System.Web.UI.WebControls.GridViewRow,int,bool>”不接受1个参数。 - Kiddo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接