using System;
public class Test
{
public static void Main()
{
// your code goes here
}
}
public abstract class IComparableHelper<T>
where T : IComparableHelper<T>
{
protected abstract bool Equals(T other);
public abstract int GetHashCode();
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
return false;
if (ReferenceEquals(this, obj))
return true;
if (obj.GetType() != this.GetType())
return false;
return Equals((T)obj);
}
public static bool operator ==(IComparableHelper<T> left, IComparableHelper<T> right)
{
return Equals(left, right);
}
public static bool operator !=(IComparableHelper<T> left, IComparableHelper<T> right)
{
return !Equals(left, right);
}
}
public class Person : IComparableHelper<Person>
{
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public string Name { get; private set; }
public int Age { get; private set; }
protected override bool Equals(Person other)
{
return string.Equals(this.Name, other.Name) && this.Age == other.Age;
}
public override int GetHashCode()
{
unchecked
{
return (this.Name.GetHashCode() * 397) ^ this.Age;
}
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCX0KfQpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSUNvbXBhcmFibGVIZWxwZXI8VD4KICAgIHdoZXJlIFQgOiBJQ29tcGFyYWJsZUhlbHBlcjxUPgp7ICAKCXByb3RlY3RlZCBhYnN0cmFjdCBib29sIEVxdWFscyhUIG90aGVyKTsKCXB1YmxpYyBhYnN0cmFjdCBpbnQgR2V0SGFzaENvZGUoKTsKCXB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQoJewoJCWlmIChSZWZlcmVuY2VFcXVhbHMobnVsbCwgb2JqKSkKCQkJcmV0dXJuIGZhbHNlOwoJCWlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb2JqKSkKCSAgICAJcmV0dXJuIHRydWU7CgkgICAgaWYgKG9iai5HZXRUeXBlKCkgIT0gdGhpcy5HZXRUeXBlKCkpCgkgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICByZXR1cm4gRXF1YWxzKChUKW9iaik7Cgl9CglwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgPT0oSUNvbXBhcmFibGVIZWxwZXI8VD4gbGVmdCwgSUNvbXBhcmFibGVIZWxwZXI8VD4gcmlnaHQpCgl7CgkJcmV0dXJuIEVxdWFscyhsZWZ0LCByaWdodCk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciAhPShJQ29tcGFyYWJsZUhlbHBlcjxUPiAgbGVmdCwgSUNvbXBhcmFibGVIZWxwZXI8VD4gIHJpZ2h0KQoJewoJCXJldHVybiAhRXF1YWxzKGxlZnQsIHJpZ2h0KTsKCX0KfQpwdWJsaWMgY2xhc3MgUGVyc29uIDogSUNvbXBhcmFibGVIZWxwZXI8UGVyc29uPgp7CglwdWJsaWMgUGVyc29uKHN0cmluZyBuYW1lLCBpbnQgYWdlKQoJewoJCXRoaXMuTmFtZSA9IG5hbWU7CgkJdGhpcy5BZ2UgPSBhZ2U7Cgl9CglwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CglwdWJsaWMgaW50IEFnZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KCQoJcHJvdGVjdGVkIG92ZXJyaWRlIGJvb2wgRXF1YWxzKFBlcnNvbiBvdGhlcikKCXsKCQlyZXR1cm4gc3RyaW5nLkVxdWFscyh0aGlzLk5hbWUsIG90aGVyLk5hbWUpICYmIHRoaXMuQWdlID09IG90aGVyLkFnZTsKCX0gCiAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKICAgIHsKICAgICAgICB1bmNoZWNrZWQKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5OYW1lLkdldEhhc2hDb2RlKCkgKiAzOTcpIF4gdGhpcy5BZ2U7CiAgICAgICAgfQogICAgfQp9