Епизод 18 – част 2 – LINQ

Директен линк към част 2 (mp3) (ogg)

Коментираният код:


public class Employee
{
     public string Name { get; set; }
     public decimal Salary { get; set; }
}

IEnumerable employees = ...;  //алтернативно IQueryable;
IEnumerable names =  employees.Where(e => e.Salary > 1000).Select(e => e.Name);
IEnumerable names2 = from e in employees
                             where e.Salary > 1000
                             select e.Name;

Tags: ,
| октомври 6th, 2013 | Posted in Uncategorized |

12 Responses to “Епизод 18 – част 2 – LINQ”

  1. Stanislav Says:

    Може би ще ви е интересно да погледнете модула Enumerable в Ruby (http://apidock.com/ruby/Enumerable). Там дефинирайки един метод за обхождане на обектите на колекция един по един и include-вайки този модул получаваш 50-тина метода, с които можеш да обработваш, филтрираш, сортираш, разделяш тази колекция.

  2. Stilgar Says:

    Ruby ми е доста слаба тема, но като гледам документацията и кода изглежда, че тези методи не са lazy, а връщат масиви.

  3. Stanislav Says:

    От Ruby 2.0, което излзе тази година можеш да напишеш:
    [1,2,3].lazy.map {|x| x * 10}.take(5).to_a, където „lazy“ в началото кара всеки елемент да мине през цялата верига, а „to_a“ (to_array) на края ги „материализира“.

  4. Stilgar Says:

    Мдам това lazy би било еквивалентно на LINQ за in-memory неща. Искам да подчертая, че това има ОГРОМНО значение, въпреки че на пръв поглед изглежда, че е едва ли не същата работа.

  5. Радослав Станков Says:

    Това lazy-то в Ruby 2.0 така работи. Иначе преди това имаше подобна концепция, но беше леко скрита и трябваше сам да си правиш такива неща. За IQueryable в ActiveRecord-a към Rails работи по подобен начин:

    User.join(:photos).where(:active => true, ‘photos.visible’ => true).order(‘created_at DESC’)

    Има и един проект Ruby Object Mapper ( http://rom-rb.org/ ) който ще включва това, но за N тип структури от данни.

    Иначе когато бях млад и глупав и си правих ORM за PHP. Имах подобна фунционалност и тя се постигаше много лесно с spl интефейсите ArrayAccess, Iterator и Countable и правиш evalulate като ти трябва да достъпиш елемент. Като за query ползваш array shortcuts тъй като това беше преди 5.3 дните, когато нямаше lambda, генератори и подобни.

    За мен като цяло тази концепция за работа с данни е без ценна (не мога да се сетя for от кога не съм писал). Даже и да няма lazy както в javascript не е чак такъв проблем в повечето случай, според мен.

  6. Stanislav Says:

    Да, по-скоро загубата на цялото accidental complexity около циклите и допълнителните променливи е предимството и за мен. Виждаш само „важната“ част от кода, а не допълнителните 5/10/15.. реда „garbage“.

  7. Stanislav Says:

    Между другото аз в момента упражнявам слабите си C++ умения с нещо подобно: https://github.com/s2gatev/RubyInspiredCollections Все още не поддържа lazy chaining, но има време.

  8. Demigod Says:

    „Lazy-то“ не идва от yield, а от yield return, което не е просто yield + return.

  9. Stilgar Says:

    Нещо не мога да се сетя какъв друг yield има освен yield return и yield break.

  10. echeveria Says:

    Бе знам че има имплементация и на рнр ама не съм я ползвал ама за js това е добро: http://www.hugoware.net/projects/jlinq/

  11. Stanislav Says:

    Е то принципно може да го имплементираш навсякъде, където имаш класове + lambda или ако езикът ти е динамичен. Има едно подобно нещо за Java в библиотеката Guava на Google. Но тъй като там lambda се имплементира с анонимни класове е зверски грозно.. Когато функционалните езици превземат света отново, всички ще пишем по този начин 😀

  12. Stilgar Says:

    Както казах е напълно възможно в различните езици това нещо което е директен порт на LINQ да не е най-доброто за съответния език. Примерно Guava не е директен порт на LINQ и се опитва много хитро да прикрие някои неща, които биха довели до много грозно количество анонимни класове. Разбира се Guava ще е obsolete след 4-5 месеца като все пак пуснат ламбдите в Java.

Leave a Reply