There's no single silver-bullet that you need to learn to be good in any kind of programming.
Take C# 3.0 with Visual Studio 2008 and .NET 3.5.
To be good in this environment, you need to look at:
- The .NET 3.5 runtime
- The .NET 3.5 BCL (base class library)
- The C# 3.0 language
- Visual Studio 2008 itself
You're asking for a checklist to be efficient at programming. "Programming" doesn't really say much at all.
Are you going to be making class libraries for other developers to consume, like helper classes and utility methods?
Are you going to be making components and controls for other developers to consume, like grid, combo-type boxes, etc.?
Are you going to be making forms that solve customer problems? If so, what kind of forms (main category: web or windows, secondary category: wpf or web/winforms)?
Are you going to employe some specific framework, like ASP.NET MVC?
There's so much to know, learn, and get a grasp on, that "becoming an efficient C# programmer" is just years away.
However, becoming a proficient programmer in some specific areas, that might be different.
But then, judging from your question, it's hard to know what your real question is.
Of course, you can look at data structures like queues, lists, hash tables, dictionaries, sets, heaps, sparse structures, whatnot, and it'll get you there, or nowhere, depending on your task at hand.
I know programmers who wouldn't know a queue from a heap if they ever saw either one and they make enterprise-level software, and I know people who don't know what a stack looks like opposed to a queue, and couldn't program their way out of a wet paper bag if their life depended on it.
There's no single answer to your question. What to learn to be an efficient programmer?
Well, how wide can you jump?