using System; using System.Collections.Generic; using System.Linq; public static class SimpleEnumerable { public static IEnumerable SimpleWhere(this IEnumerable source, Func predicate) { foreach (TSource element in source) { if (predicate(element)) { yield return element; } } } } public class MyClass { private string _att01; private string _att02; private string _att03; public int instanceNum; public string att01 { get { Console.WriteLine("att01 of instance {0}", instanceNum); return _att01; } set { _att01 = value; } } public string att02 { get { Console.WriteLine("att02 of instance {0}", instanceNum); return _att02; } set { _att02 = value; } } public string att03 { get { Console.WriteLine("att03 of instance {0}", instanceNum); return _att03; } set { _att03 = value; } } } public class Test { public static void Main() { var coll = new[] { new MyClass { instanceNum = 0, att01 = "A", att02 = "B", att03 = "C" }, new MyClass { instanceNum = 1, att01 = "X", att02 = "B", att03 = "C" }, new MyClass { instanceNum = 2, att01 = "X", att02 = "Y", att03 = "C" }, new MyClass { instanceNum = 3, att01 = "X", att02 = "Y", att03 = "Z" }, }; Console.WriteLine("Method 1"); var list1 = coll .Where(x => x.att01 == "X") .Where(x => x.att02 == "Y") .Where(x => x.att03 == "Z") .SingleOrDefault(); Console.WriteLine(); Console.WriteLine("Method 2"); var list2 = coll .Where(x => x.att01 == "X" && x.att02 == "Y" && x.att03 == "Z") .SingleOrDefault(); Console.WriteLine("Method 3"); var list3 = coll .SimpleWhere(x => x.att01 == "X") .SimpleWhere(x => x.att02 == "Y") .SimpleWhere(x => x.att03 == "Z") .SingleOrDefault(); } }