using System;
using System.Globalization ;
using System.Linq ;
using System.Collections .Generic ;
public class Test
{
public class Foo
{
public int ID { get; set; }
public override int GetHashCode( )
{
Console.WriteLine ( "in GetHashCode, ID=" + ID) ;
return ID.GetHashCode ( ) ;
}
public override bool Equals( object obj)
{
Console.WriteLine ( "in Equals, ID=" + ID) ;
Foo f2 = obj as Foo;
if ( f2 == null ) return false ;
return ID == f2.ID ;
}
}
public static void Main( )
{
IEnumerable< Foo> list1 = new List< Foo> ( ) { new Foo { ID = 1 } , new Foo { ID = 2 } , new Foo { ID = 3 } } ;
IEnumerable< Foo> list2 = new List< Foo> ( ) { new Foo { ID = 2 } , new Foo { ID = 3 } , new Foo { ID = 4 } } ;
Console.WriteLine ( "before Intersect" ) ;
IEnumerable< Foo> inBoth = list1.Intersect ( list2) ;
Console.WriteLine ( "after Intersect" ) ;
foreach ( Foo fDup in inBoth)
{
// now GetHashCode will be executed
Console.WriteLine ( "in foreach, ID=" + fDup.ID ) ;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIGNsYXNzIEZvbwogICAgewogICAgICAgIHB1YmxpYyBpbnQgSUQgeyBnZXQ7IHNldDsgfQoKICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJpbiBHZXRIYXNoQ29kZSwgSUQ9IiArIElEKTsKICAgICAgICAgICAgcmV0dXJuIElELkdldEhhc2hDb2RlKCk7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQogICAgICAgIHsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImluIEVxdWFscywgSUQ9IiArIElEKTsKICAgICAgICAgICAgRm9vIGYyID0gb2JqIGFzIEZvbzsKICAgICAgICAgICAgaWYgKGYyID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIElEID09IGYyLklEOwogICAgICAgIH0KICAgIH0KCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJSUVudW1lcmFibGU8Rm9vPiBsaXN0MSA9IG5ldyBMaXN0PEZvbz4oKSB7IG5ldyBGb28geyBJRCA9IDEgfSwgbmV3IEZvbyB7IElEID0gMiB9LCBuZXcgRm9vIHsgSUQgPSAzIH0gfTsKICAgICAgICBJRW51bWVyYWJsZTxGb28+IGxpc3QyID0gbmV3IExpc3Q8Rm9vPigpIHsgbmV3IEZvbyB7IElEID0gMiB9LCBuZXcgRm9vIHsgSUQgPSAzfSwgbmV3IEZvbyB7IElEID0gNCB9IH07CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImJlZm9yZSBJbnRlcnNlY3QiKTsKICAgICAgICBJRW51bWVyYWJsZTxGb28+IGluQm90aCA9IGxpc3QxLkludGVyc2VjdChsaXN0Mik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFmdGVyIEludGVyc2VjdCIpOwoKICAgICAgICBmb3JlYWNoIChGb28gZkR1cCBpbiBpbkJvdGgpCiAgICAgICAgewogICAgICAgICAgICAvLyBub3cgR2V0SGFzaENvZGUgd2lsbCBiZSBleGVjdXRlZCAKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImluIGZvcmVhY2gsIElEPSIgKyBmRHVwLklEKTsKICAgICAgICB9Cgl9Cn0=
stdout
before Intersect
after Intersect
in GetHashCode, ID=2
in GetHashCode, ID=3
in GetHashCode, ID=4
in GetHashCode, ID=1
in GetHashCode, ID=2
in Equals, ID=2
in foreach, ID=2
in GetHashCode, ID=3
in Equals, ID=3
in foreach, ID=3