В чём преимущество LINQ нотации относительно methods chain?
От: valker  
Дата: 23.09.09 10:19
Оценка:
Здравствуйте!

В общем, сабж. Например:


var element = XElement.Parse(txtXml.Text);

// вариант №1
var res = from c in element.Elements() orderby c.Attribute("age").Value select c;

// вариант №2
var res2 = element.Elements().OrderBy(c =>
{
  var atr = c.Attribute("age");
  return atr == null ? 0 : int.Parse(atr.Value);
});


С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?

Заранее спасибо.
linq
Re: В чём преимущество LINQ нотации относительно methods cha
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.09.09 10:27
Оценка: 4 (1) +2
Здравствуйте, valker, Вы писали:

V> В чём преимущество LINQ нотации относительно methods chain?

V> С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?

Иногда linq нотация более лаконичная и наглядная.
Но не всегда. Иногда удобнее писать вызовы методов. А иногда запись в виде методов — вообще единственно возможный вариант.
А иногда удобно смешивать обе записи.
Re: В чём преимущество LINQ нотации относительно methods cha
От: Qbit86 Кипр
Дата: 23.09.09 10:45
Оценка:
Здравствуйте, valker, Вы писали:

V>С учётом того, что во втором варианте можно реализовать более "навороченную" логику проверки. Или я не прав?


• В method chain нотации нельзя вводить промежуточные значения а-ля let. Иногда без этого нельзя обойтись.
• GroupJoin'ы гораздо проще писать с помощью comprehension syntax.

А в остальном — да, я предпочитаю lambda syntax.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: В чём преимущество LINQ нотации относительно methods
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.09.09 10:53
Оценка: 8 (2) +1
Здравствуйте, 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
От: Qbit86 Кипр
Дата: 23.09.09 11:20
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Qbit86, Вы писали:


Q>>• В method chain нотации нельзя вводить промежуточные значения а-ля let. Иногда без этого нельзя обойтись.

S>Не нельзя, просто не так красиво.

Ок, если я захочу промежуточно зафорсить
...
let count = someSubQuery.Count()
// Дальше count используется несколько раз.
...

у меня обращение методу Count() будет однократным, или так же несколько раз и будет проходить?
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: В чём преимущество LINQ нотации относительно methods
От: Qbit86 Кипр
Дата: 23.09.09 11:24
Оценка:
А, да, в твоём примере трансляции тоже один раз вычисляется. Согласен.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: В чём преимущество LINQ нотации относительно methods
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.09.09 21:00
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>А, да, в твоём примере трансляции тоже один раз вычисляется. Согласен.


Скажу больше. Синтаксическе навороты всегда транслируются в аналогичный кода без синтаксиса (по спецификации). Так что нет такой конструкции которую нельзя было бы выразить без синтаксиса. Обратное не верно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: В чём преимущество LINQ нотации относительно methods cha
От: Кирилл Осенков Украина
Дата: 26.09.09 02:05
Оценка: +2
Я почти всегда методы использую
Re: В чём преимущество LINQ нотации относительно methods cha
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.09.09 07:33
Оценка:
Здравствуйте, valker, Вы писали:

V>В общем, сабж.


Два момента:
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>>
AVK Blog
Re[2]: В чём преимущество LINQ нотации относительно methods
От: Аноним  
Дата: 26.09.09 11:40
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, valker, Вы писали:


AVK>2) SelectMany в форме QC не создает уровень вложенности


А можно пояснить, что бы имеете ввиду?
Re[3]: В чём преимущество LINQ нотации относительно methods
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.09.09 15:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А можно пояснить, что бы имеете ввиду?


SelectMany сам по себе требует лямбду, внутри которой формируется второй итератор. Получается вложеность. А в QC форме итераторы просто следуют один за другим в любом количестве, без вложености.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
AVK Blog
Re[4]: В чём преимущество LINQ нотации относительно methods
От: Пельмешко Россия blog
Дата: 27.09.09 16:48
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.