【问题标题】:Lambda NULL check in List foreach find methodList foreach 查找方法中的 Lambda NULL 检查
【发布时间】:2015-08-27 20:37:20
【问题描述】:

如何在具有 ForEach 和 Find 方法的 lambda 表达式中检查 NULL 值。

例如,我有一个下面的方法,它采用逗号分隔的值列表,遍历它们,并为每个值找到一个 SelectListItem,如果找到,则标记为 Selected。当没有找到匹配项并引发空引用异常时,就会出现问题。

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);
}

【问题讨论】:

  • 你不需要ToList(),它会拆分成Array
  • @Greg 数组没有ForEach 方法。
  • @juharr 他们没有,但它相当于foreach,所以当你可以做foreach 时,为什么要为ForEach 创建一个List
  • items.ToList() 绝对没有根据。
  • @Greg 我完全同意并认为ForEach 是可憎的,但您的评论听起来他们可以删除ToList

标签: c# lambda


【解决方案1】:

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 MarkListItemsSelected(string param, IList<SelectListItem> items)
{
    var filters = param.ToUpper().Split(';');

    foreach( var x in items ) {
        x.Selected = filters.Contains(x.Text.ToUpper());
    }
}

【讨论】:

  • 我认为ToList()Where 部分在这里翻转。编辑:也就是说,应该是items.Where(...).ToList().ForEach(...);
  • 更好的是,只需使用foreach,就不需要ToList
  • 呃,Linq 的副作用,请不要。
  • 我认为这里编辑使用.All 是一个倒退。使用ToList().ForEachforeach 循环,但不要使用.All;这将滥用 LINQ 引入副作用的 查询 特性。再加上它很奇怪,很少见的代码。另外,它取决于被更改的属性 (.Selected) 恰好是布尔值这一事实。
  • 对最新编辑的一个小问题(对不起!),“传统循环”版本的行为略有不同,因为原始代码不会更改 SelectedListItem 的当前值,如果它没有' t 匹配过滤器。也就是说,如果它最初是true,但它不匹配,则它保持true。这个新代码会将其设置为false。 (也就是说,这对 OP 来说实际上可能是 的事情,但我认为无论如何都应该注意。)编辑:实际上,更糟糕的是:它可以匹配早期过滤器,然后制作false 通过不匹配的过滤器。我会认为它被窃听了。
【解决方案2】:

只需给 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;
        });
}

【讨论】:

  • 如果您要在 ForEach 中使用多行 lambda,您不妨使用 foreach
  • @juharr 我同意,但只是在回答问题:)
  • 恕我直言,该问题中没有任何内容需要您给出使用ForEach的答案
  • 实际上标题说的是“foreach”而不是“ForEach”。所以根据你的逻辑,我们应该只给foreach答案。
猜你喜欢
  • 2012-07-28
  • 2014-08-14
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2013-03-02
  • 2017-08-25
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多