[英]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
由於操作的順序,這不起作用。 在.Checked
為CheckBox
之前評估.Checked
,這意味着您正在嘗試訪問Control
的CheckBox
屬性,並且它不存在。 額外的一對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.