Thinking in C# by Larry O’BrienandBruce Eckel