C# Lambda NULL签入列表foreach find方法
如何检查具有ForEach和Find方法的lambda表达式中的NULL值 例如,我有一个下面的方法,它接受一个逗号分隔的值列表,对它们进行迭代,并为每个值找到一个SelectListItem,如果找到,则将其标记为Selected。当找不到匹配项并且抛出空引用异常时,就会出现问题C# Lambda NULL签入列表foreach find方法,c#,lambda,C#,Lambda,如何检查具有ForEach和Find方法的lambda表达式中的NULL值 例如,我有一个下面的方法,它接受一个逗号分隔的值列表,对它们进行迭代,并为每个值找到一个SelectListItem,如果找到,则将其标记为Selected。当找不到匹配项并且抛出空引用异常时,就会出现问题 private static void MarkListItemsSelected(string param, IList<SelectListItem> items) { var filters
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.Split(';');
filters.ToList()
.ForEach(x => items.ToList()
.Find(y => y.Text.ToUpper().Equals(x.ToUpper()))
.Selected = true);
}
private static void markListItems已选中(字符串参数,IList项)
{
变量过滤器=参数拆分(“;”);
filters.ToList()
.ForEach(x=>items.ToList()
.Find(y=>y.Text.ToUpper().Equals(x.ToUpper()))
.Selected=true);
}
Linq示例:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.ToUpper().Split(';');
items.ToList()
.ForEach(x => { x.Selected = filters.Contains(x.Text.ToUpper());});
}
private static void markListItems已选中(字符串参数,IList项)
{
var filters=param.ToUpper().Split(“;”);
项目.收费表()
.ForEach(x=>{x.Selected=filters.Contains(x.Text.ToUpper());});
}
传统循环:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.ToUpper().Split(';');
foreach( var x in items ) {
x.Selected = filters.Contains(x.Text.ToUpper());
}
}
private static void markListItems已选中(字符串参数,IList项)
{
var filters=param.ToUpper().Split(“;”);
foreach(项目中的var x){
x、 Selected=filters.Contains(x.Text.ToUpper());
}
}
Linq示例:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.ToUpper().Split(';');
items.ToList()
.ForEach(x => { x.Selected = filters.Contains(x.Text.ToUpper());});
}
private static void markListItems已选中(字符串参数,IList项)
{
var filters=param.ToUpper().Split(“;”);
项目.收费表()
.ForEach(x=>{x.Selected=filters.Contains(x.Text.ToUpper());});
}
传统循环:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.ToUpper().Split(';');
foreach( var x in items ) {
x.Selected = filters.Contains(x.Text.ToUpper());
}
}
private static void markListItems已选中(字符串参数,IList项)
{
var filters=param.ToUpper().Split(“;”);
foreach(项目中的var x){
x、 Selected=filters.Contains(x.Text.ToUpper());
}
}
只需在lambda中添加一个空检查:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.Split(';');
filters.ToList().ForEach(
x =>
{
var found = items.ToList().Find(y => y.Text.ToUpper().Equals(x.ToUpper()));
if (found != null)
found.Selected = true;
});
}
private static void markListItems已选中(字符串参数,IList项)
{
变量过滤器=参数拆分(“;”);
filters.ToList().ForEach(
x=>
{
var found=items.ToList().Find(y=>y.Text.ToUpper().Equals(x.ToUpper());
如果(找到!=null)
found.Selected=true;
});
}
只需在lambda中添加一个空检查:
private static void MarkListItemsSelected(string param, IList<SelectListItem> items)
{
var filters = param.Split(';');
filters.ToList().ForEach(
x =>
{
var found = items.ToList().Find(y => y.Text.ToUpper().Equals(x.ToUpper()));
if (found != null)
found.Selected = true;
});
}
private static void markListItems已选中(字符串参数,IList项)
{
变量过滤器=参数拆分(“;”);
filters.ToList().ForEach(
x=>
{
var found=items.ToList().Find(y=>y.Text.ToUpper().Equals(x.ToUpper());
如果(找到!=null)
found.Selected=true;
});
}
你不需要ToList()
,它会被分割成一个数组
。@Greg数组没有ForEach
方法。@juharr没有,但它相当于ForEach
那么,如果你可以只做ForEach
.items.ToList(),为什么要为ForEach
创建一个列表呢是毫无根据的。@Greg我完全同意,认为ForEach
是一个令人憎恶的东西,但是你的评论听起来好像他们可以删除ToList
。你不需要ToList()
,它会分解成一个Array
。@Greg Array没有ForEach
方法。@juharr他们没有,但是它相当于foreach
那么,既然你可以做foreach
,为什么还要为foreach
创建一个列表呢?items.ToList()绝对是没有根据的。@Greg我完全同意,并且认为foreach
是一个令人憎恶的东西,但是你的评论听起来好像他们可以删除ToList
。我认为ToList()
和中的部分在这里翻转。编辑:也就是说,应该是items.Where(…).ToList().ForEach(…)代码>更好的是,只需使用foreach
即可,无需使用ToList
。啊,Linq中的副作用,请不要。我认为编辑使用。所有这些都是一个倒退。使用ToList().ForEach
或ForEach
循环,但不要使用.All
;这将滥用LINQ的查询性质,引入副作用。另外,这是一种奇怪的、罕见的代码。另外,它取决于正在更改的属性(.Selected
)恰好是一个布尔值版本的行为稍有不同,因为如果SelectedListItem
与筛选器不匹配,则原始代码不会更改其当前值。也就是说,如果它最初是true
,但它不匹配,它将保持true
。此新代码将其设置为false
。(也就是说,这实际上对OP来说可能是件好事,但我认为无论如何都应该注意。)编辑:事实上,它甚至更糟:它可以匹配早期的过滤器,然后被不匹配的过滤器设置为false
。我想它是窃听的。我想<代码> toSist[()/代码>和<代码>这里,部分在这里翻转。编辑:也就是说,应该是items.Where(…).ToList().ForEach(…)代码>更好的是,只需使用foreach
即可,无需使用ToList
。啊,Linq中的副作用,请不要。我认为编辑使用。所有这些都是一个倒退。使用ToList().ForEach
或ForEach
循环,但不要使用.All
;这将滥用LINQ的查询性质,引入副作用。另外,这是一种奇怪的、罕见的代码。另外,它取决于正在更改的属性(.Selected
)恰好是一个布尔值版本的行为稍有不同,因为如果SelectedListItem
与筛选器不匹配,则原始代码不会更改其当前值。也就是说,如果它最初是true
,但它不匹配,它将保持true
。此新代码将其设置为false
。(也就是说,这对OP来说可能是件好事,但我认为无论如何都应该注意。)编辑:事实上,这是夏娃