簡體   English   中英

如何將Foreach循環轉換為Linq(在datagridview中)

[英]How to convert Foreach loop to Linq (in datagridview)

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個參數

非常感謝

Linq似乎沒有一個好的“每個”聚合。 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
});

並使用Parallel 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轉換為CheckBox才能訪問Checked屬性。 你不能這樣做:

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

由於操作的順序,這不起作用。 .CheckedCheckBox之前評估.Checked ,這意味着您正在嘗試訪問ControlCheckBox屬性,並且它不存在。 額外的一對parens修復了這一點。

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

最后一件事,你不需要在比較中做== true Checked已經是一個布爾值。 如果你喜歡那里為了清晰(有些人這樣做),那么一定要保留它。 它不被認為是不好的做法或任何事情,這只是一個偏好問題。

你需要. 而不是=朝向最后:

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

我無法確定這是唯一的錯誤,因為你沒有說明你得到了什么錯誤。

我認為這應該有效:

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

你遇到了什么錯誤?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM