Что ж, решение LINQ to XML действительно простое, поэтому я предлагаю вам постараться сделать так, чтобы вам было удобно, а не создавать более сложное решение. Вот код с множеством объяснений ...
// Load the whole document into memory, as an element
XElement root = XElement.Load(xmlReader);
// Get a sequence of users
IEnumerable<XElement> users = root.Elements("user");
// Convert this sequence to a dictionary...
Dictionary<string, string> userMap = users.ToDictionary(
element => element.Attribute("name").Value, // Key selector
element => element.Value); // Value selector
Конечно, вы могли бы сделать все это за один раз - и я бы, вероятно, соединил второе и третье утверждения. Но это примерно так же концептуально просто, как это возможно. Ситуация усложнилась бы, если бы вы захотели использовать обработку ошибок вокруг возможности того, что пользовательский элемент может не иметь имени, по общему признанию. (Этот код будет генерировать исключение NullReferenceException в этом случае.)
Обратите внимание, что предполагается, что вы хотите, чтобы имя было ключом, а id - значением. Если вы хотите использовать хеш-таблицу наоборот, просто переключите порядок лямбда-выражений.