var element = XElement.Parse(txtXml.Text);
// вариант №1var res = from c in element.Elements() orderby c.Attribute("age").Value select c;
// вариант №2var res2 = element.Elements().OrderBy(c =>
{
var atr = c.Attribute("age");
return atr == null ? 0 : int.Parse(atr.Value);
});
С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?
Здравствуйте, valker, Вы писали:
V> В чём преимущество LINQ нотации относительно methods chain? V> С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?
Иногда linq нотация более лаконичная и наглядная.
Но не всегда. Иногда удобнее писать вызовы методов. А иногда запись в виде методов — вообще единственно возможный вариант.
А иногда удобно смешивать обе записи.
Re: В чём преимущество LINQ нотации относительно methods cha
Здравствуйте, valker, Вы писали:
V>С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?
• В method chain нотации нельзя вводить промежуточные значения а-ля let. Иногда без этого нельзя обойтись.
• GroupJoin'ы гораздо проще писать с помощью comprehension syntax.
А в остальном — да, я предпочитаю lambda syntax.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: В чём преимущество LINQ нотации относительно methods
Здравствуйте, Qbit86, Вы писали:
Q>• В method chain нотации нельзя вводить промежуточные значения а-ля let. Иногда без этого нельзя обойтись.
Не нельзя, просто не так красиво.
26.7.1.4 (спецификация)
The example
from o in orders
let t = o.Details.Sum(d => d.UnitPrice * d.Quantity)where t >= 1000
select new { o.OrderID, Total = t }
is translated into
from * in
from o in orders
select new { o, t = o.Details.Sum(d => d.UnitPrice * d.Quantity) }where t >= 1000
select new { o.OrderID, Total = t }
the final translation of which is
orders.
Select(o => new { o, t = o.Details.Sum(d => d.UnitPrice * d.Quantity) }).
Where(x => x.t >= 1000).
Select(x => new { x.o.OrderID, Total = x.t })
Re[3]: В чём преимущество LINQ нотации относительно methods
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Qbit86, Вы писали:
Q>>• В method chain нотации нельзя вводить промежуточные значения а-ля let. Иногда без этого нельзя обойтись. S>Не нельзя, просто не так красиво.
Ок, если я захочу промежуточно зафорсить
...
let count = someSubQuery.Count()
// Дальше count используется несколько раз.
...
у меня обращение методу Count() будет однократным, или так же несколько раз и будет проходить?
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: В чём преимущество LINQ нотации относительно methods
Здравствуйте, Qbit86, Вы писали:
Q>А, да, в твоём примере трансляции тоже один раз вычисляется. Согласен.
Скажу больше. Синтаксическе навороты всегда транслируются в аналогичный кода без синтаксиса (по спецификации). Так что нет такой конструкции которую нельзя было бы выразить без синтаксиса. Обратное не верно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: В чём преимущество LINQ нотации относительно methods cha
Два момента:
1) Если много раз у лямбд повторяются одинаковые аргументы, query comprehension форма (так оно называется, а не linq нотация) позволяет писать эти аргументы только оди раз.
2) SelectMany в форме QC не создает уровень вложенности
3) Как тут уже заметили, let намного лаконичнее промежуточных анонимных типов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
Здравствуйте, <Аноним>, Вы писали:
А>А можно пояснить, что бы имеете ввиду?
SelectMany сам по себе требует лямбду, внутри которой формируется второй итератор. Получается вложеность. А в QC форме итераторы просто следуют один за другим в любом количестве, без вложености.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, <Аноним>, Вы писали:
А>>А можно пояснить, что бы имеете ввиду?
AVK>SelectMany сам по себе требует лямбду, внутри которой формируется второй итератор. Получается вложеность. А в QC форме итераторы просто следуют один за другим в любом количестве, без вложености.
Точно такая же лямбда требуется после in Нету никакой вложенности:
var list = new List<List<List<List<int>>>>();
IEnumerable<int> query1 =
list
.SelectMany(x => x)
.SelectMany(x => x)
.SelectMany(x => x);
IEnumerable<int> query2 =
from a in list
from b in a
from c in b
from d in c
select d;