具有2个谓词的Linq-to-Objects Where子句

Jon*_*son 4 linq-to-objects

有2个Where子句或1个Where子句与&&运算符或更不重要?

list.Where(x => x.Prop1 == value1).Where(x => x.Prop2 == value2).ToList();
Run Code Online (Sandbox Code Playgroud)

要么

list.Where(x => x.Prop1 == value1 && x.Prop2 == value2).ToList();
Run Code Online (Sandbox Code Playgroud)

Mic*_*edy 5

最好在单个lambda中使用第二个测试和两个测试.它只会循环列表一次,并且只会经常调用一半代表.第一个版本循环列表两次.

需要明确的是,这是更好的选择:

list.Where(x => x.Prop1 == value1 && x.Prop2 == value2).ToList();
Run Code Online (Sandbox Code Playgroud)

哪个也可以写

var results =
   (from x in list
   where x.Prop1 == value1 && x.Prop2 == value2
   select x).ToList();
Run Code Online (Sandbox Code Playgroud)

如果你可以避免.ToList()使用它并将其用作IEnumerable<T>,你通常会得到更好的性能(除非你反复阅读).

  • @Jon 和 Michael,第一个版本不会在列表中循环两次。会有两个代表,是的,但是对序列中的每个元素一个接一个地执行检查,这不是整个序列经过第一个 * 紧接着 * 结果经过第二个的情况。该列表仅遍历一次。 (2认同)
  • 和乔恩,话虽如此,我同意我会选择第二个版本。 (2认同)