Если у вас возникли сложности со всем, что связано с LINQ to XML, я бы посоветовал сделать небольшой шаг назад и просто взглянуть на linq в целом. Я считаю, что linq очень стоит усилий и окупит вас много раз, особенно когда мы переместимся в многоядерный мир.
Я бы посоветовал вам на мгновение забыть часть XML и просто подумать о том, что делает linq - после того, как вы поймете, что такое linq, тогда это упростит поиск специализированных материалов для XML. Это помогает мне думать о linq с учетом этих двух вещей:
-
Он выражает стандартные «операторы» (методы расширения) для всего, что реализует интерфейс IEnumerable Другими словами, linq - это просто вызов метода. Некоторые методы принимают код (Func), некоторые (First ()) - нет.
-
это позволяет вам меньше беспокоиться о том, как эти операторы дают вам результат, и больше просто о том, что объявляет ваше намерение .
Нам, насущным языковым специалистам, трудно отказаться от мелкой (сверх) спецификации как получить результат. Что нам в основном дает linq, так это способ объявить , что мы хотим получить результат, не говоря точно, как его получить. Вот почему, IMO, linq так важно выучить, поскольку именно это «разделение» намерений от точного «как» является действительно классной частью linq. В основном это прививает в функциональных концепциях языка старый плохой императив C #.
Полезным средством обучения для LINQ является написание императивного кода на C #, который будет делать то же самое . Сделайте это несколько раз, и вдруг вы увидите шаблон , который linq делает для вас. Так, например, рассмотрим объявление 'linq-to-object'.
string[] names= new string[] { "kevin", "tristan", jen" };
var result = names.where(n => n.length() > 3);
аналог в C # для запроса linq будет:
List<string> list = new List<string>();
foreach(string n in names)
{
if (n.length > 3) list.add(n);
}
Я думаю, что в этом примере довольно легко увидеть, как linq делает то же самое, что и foreach (на самом деле это очень близко к этому), но у вас нет всего пуха, который просто компилятор Goo. В версии linq меньше уловок и больше намерений. Другой способ выразить это в том, что linq неявно делает для вас скучный шаблонный материал , позволяя вашему коду просто показать интересную часть.
В функциональном смысле, метод where () является функцией более высокого порядка . Это просто означает, что это функция, которая сама принимает или возвращает функцию. Где () принимает лямбда - интересная часть цикла . Лямбда - это анонимная функция в C #, поэтому Where () принимает функцию, поэтому она высшего порядка . Я упоминаю об этом, потому что эта концепция является настолько мощной и ключевой для понимания linq и дает представление о том, как на самом деле linq представляет собой совершенно новую программную модель (функциональное программирование), встроенную в C #. Получение этого «высшего порядка» очень полезно для понимания linq.
Работа с прямыми запросами List , такими как приведенный выше, я думаю, является наилучшим способом понять, как работает linq. Если вы чувствуете себя комфортно с прямыми запросами L-2-O, а затем снова посмотрите на XML - я думаю, вы обнаружите, что тогда они будут иметь больше смысла.
С появлением платформы Reactive в .NET 4.0 мы увидим, что linq расширяется не только для «вытягивания» запросов, но и для «проталкивания» сценариев. Т.е .: коллекция сгенерирует код при изменении. Я полагаю, что концепции функционального программирования (с которым linq является туннелем C #) являются наиболее вероятным способом решения проблем параллелизма и параллелизма, поэтому очень важно изучить их, а не просто код более краткий.