转换在哪里不好?

时间:2010-01-26 17:43:20

标签: .net linq

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

Convert.ToInt32中调用

Where

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

Where

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

3 个答案:

答案 0 :(得分:3)

这两个都有缺陷 -

您正在对集合调用.Where(...),但对结果不执行任何操作。这将无效,因为Where不会更改原始集合 - 它会返回与谓词匹配的新IEnumerable<T>项。

话虽如此,我更喜欢第二个选项 - 在第一个选项中,Convert.ToInt32调用将针对集合中的每个元素运行一次。在一个小集合中,这可能无关紧要,但随着集合变大,它会变慢。

在这种情况下,您可能会或可能不会注意到这种差异,但在使用LINQ语句之前声明变量是一种很好的做法(IMO)。我经常看到人们认为LINQ很慢的情况仅仅是因为他们在谓词中进行了昂贵的计算。在这种情况下,你的方法相对较快,所以它可能无关紧要,但作为一种练习,遵循第二种模式是一个好习惯。

答案 1 :(得分:2)

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

但除非这是一个性能关键的代码(不太可能;它看起来像GUI代码),否则你不会注意到差异。

答案 2 :(得分:2)

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