代码之家  ›  专栏  ›  技术社区  ›  jball

转化到哪里不好?[关闭]

  •  2
  • jball  · 技术社区  · 14 年前

    考虑到以下两种情况,哪一种更可取(如果两者都不好,那么以完全不同的方式进行也是一种选择)?

    Convert.ToInt32 调用 Where :

     var items = GetItems();
     if (aDropDownList.SelectedIndex > 0) 
     {
         items = items.Where(x => 
                 x.IntProperty == Convert.ToInt32(aDropDownList.SelectedValue));
     }
    

    转换32 以前打过电话 在哪里? :

    var items = GetItems();
     if (aDropDownList.SelectedIndex > 0) 
     {
         int selectedDropDownValue = Convert.ToInt32(aDropDownList.SelectedValue);
         items = items.Where(x => x.IntProperty == selectedDropDownValue);
     }
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas    14 年前

    我更喜欢第二种。它只进行一次转换,而不是多次转换。

    但是,除非这是一段性能关键的代码(不太可能,它看起来像GUI代码),否则您不会注意到有什么不同。

        2
  •  3
  •   Reed Copsey    14 年前

    这两个都有缺点-

    你在打电话 .Where(...) 在集合上,但不处理结果。这将没有任何效果,因为Where不会更改原始集合-它将返回一个新的 IEnumerable<T> 与谓词匹配的项。

    也就是说,我更喜欢第二种选择——在第一种选择中, Convert.ToInt32 将为集合中的每个元素运行一次调用。在一个小的集合中,这可能无关紧要,但随着集合的增大,它将变慢。

    在这种情况下,您可能会注意到,也可能不会注意到这种差异,但在使用LINQ语句之前声明变量是一种良好的做法(IMO)。我经常看到这样的情况:人们仅仅因为在谓词中进行昂贵的计算而假设Linq速度较慢。在这种情况下,您的方法相对较快,因此可能无关紧要,但作为一种实践,遵循第二种模式是一个好习惯。

        3
  •  2
  •   codekaizen    14 年前

    我能看到的唯一区别是编译器将如何生成lambda。在第二个版本中,该值被捕获而不被引用,这将在多线程环境中产生效果。