using System;
using System.Collections .Generic ;
using System.Linq ;
public static class SimpleEnumerable
{
public static IEnumerable< TSource> SimpleWhere< TSource> ( this IEnumerable< TSource> source, Func< TSource, bool> 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 ( ) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUVudW1lcmFibGUKewogICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUU291cmNlPiBTaW1wbGVXaGVyZTxUU291cmNlPih0aGlzIElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgRnVuYzxUU291cmNlLCBib29sPiBwcmVkaWNhdGUpCiAgICB7CiAgICAJZm9yZWFjaCAoVFNvdXJjZSBlbGVtZW50IGluIHNvdXJjZSkKICAgIAl7CiAgICAJCWlmIChwcmVkaWNhdGUoZWxlbWVudCkpCiAgICAJCXsKICAgIAkJCXlpZWxkIHJldHVybiBlbGVtZW50OwogICAgCQl9CiAgICAJfQogICAgfQp9CgpwdWJsaWMgY2xhc3MgTXlDbGFzcwp7CiAgICBwcml2YXRlIHN0cmluZyBfYXR0MDE7CiAgICBwcml2YXRlIHN0cmluZyBfYXR0MDI7CiAgICBwcml2YXRlIHN0cmluZyBfYXR0MDM7CiAgICBwdWJsaWMgaW50IGluc3RhbmNlTnVtOwoKICAgIHB1YmxpYyBzdHJpbmcgYXR0MDEKICAgIHsKICAgICAgICBnZXQKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhdHQwMSBvZiBpbnN0YW5jZSB7MH0iLCBpbnN0YW5jZU51bSk7CiAgICAgICAgICAgIHJldHVybiBfYXR0MDE7CiAgICAgICAgfQogICAgICAgIHNldAogICAgICAgIHsKICAgICAgICAgICAgX2F0dDAxID0gdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdHJpbmcgYXR0MDIKICAgIHsKICAgICAgICBnZXQKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhdHQwMiBvZiBpbnN0YW5jZSB7MH0iLCBpbnN0YW5jZU51bSk7CiAgICAgICAgICAgIHJldHVybiBfYXR0MDI7CiAgICAgICAgfQogICAgICAgIHNldAogICAgICAgIHsKICAgICAgICAgICAgX2F0dDAyID0gdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwdWJsaWMgc3RyaW5nIGF0dDAzCiAgICB7CiAgICAgICAgZ2V0CiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYXR0MDMgb2YgaW5zdGFuY2UgezB9IiwgaW5zdGFuY2VOdW0pOwogICAgICAgICAgICByZXR1cm4gX2F0dDAzOwogICAgICAgIH0KICAgICAgICBzZXQKICAgICAgICB7CiAgICAgICAgICAgIF9hdHQwMyA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KfQoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJICAgIHZhciBjb2xsID0gbmV3W10gCgkgICAgewoJICAgICAgICBuZXcgTXlDbGFzcyB7IGluc3RhbmNlTnVtID0gMCwgYXR0MDEgPSAiQSIsIGF0dDAyID0gIkIiLCBhdHQwMyA9ICJDIiB9LAoJICAgICAgICBuZXcgTXlDbGFzcyB7IGluc3RhbmNlTnVtID0gMSwgYXR0MDEgPSAiWCIsIGF0dDAyID0gIkIiLCBhdHQwMyA9ICJDIiB9LAoJICAgICAgICBuZXcgTXlDbGFzcyB7IGluc3RhbmNlTnVtID0gMiwgYXR0MDEgPSAiWCIsIGF0dDAyID0gIlkiLCBhdHQwMyA9ICJDIiB9LAoJICAgICAgICBuZXcgTXlDbGFzcyB7IGluc3RhbmNlTnVtID0gMywgYXR0MDEgPSAiWCIsIGF0dDAyID0gIlkiLCBhdHQwMyA9ICJaIiB9LAoJICAgIH07CgkKCSAgICBDb25zb2xlLldyaXRlTGluZSgiTWV0aG9kIDEiKTsKCSAgICB2YXIgbGlzdDEgPSBjb2xsCgkgICAgICAgIC5XaGVyZSh4ID0+IHguYXR0MDEgPT0gIlgiKQoJICAgICAgICAuV2hlcmUoeCA9PiB4LmF0dDAyID09ICJZIikKCSAgICAgICAgLldoZXJlKHggPT4geC5hdHQwMyA9PSAiWiIpCgkgICAgICAgIC5TaW5nbGVPckRlZmF1bHQoKTsKCQoJICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgkgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk1ldGhvZCAyIik7CgkgICAgdmFyIGxpc3QyID0gY29sbAoJICAgICAgICAuV2hlcmUoeCA9PiB4LmF0dDAxID09ICJYIiAmJiB4LmF0dDAyID09ICJZIiAmJiB4LmF0dDAzID09ICJaIikKCSAgICAgICAgLlNpbmdsZU9yRGVmYXVsdCgpOwoKCSAgICBDb25zb2xlLldyaXRlTGluZSgiTWV0aG9kIDMiKTsKCSAgICB2YXIgbGlzdDMgPSBjb2xsCgkgICAgICAgIC5TaW1wbGVXaGVyZSh4ID0+IHguYXR0MDEgPT0gIlgiKQoJICAgICAgICAuU2ltcGxlV2hlcmUoeCA9PiB4LmF0dDAyID09ICJZIikKCSAgICAgICAgLlNpbXBsZVdoZXJlKHggPT4geC5hdHQwMyA9PSAiWiIpCgkgICAgICAgIC5TaW5nbGVPckRlZmF1bHQoKTsKCQoJfQp9