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

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

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


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

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

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

12 коментара to “Епизод 18 – част 2 – LINQ”

  1. Stanislav Bulgaria Google Chrome Windows Says:

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

  2. Stilgar Bulgaria Internet Explorer Windows Says:

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

  3. Stanislav Bulgaria Google Chrome Windows Says:

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

  4. Stilgar Bulgaria Internet Explorer Windows Says:

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

  5. Радослав Станков Bulgaria Google Chrome Mac OS 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 Bulgaria Google Chrome Windows Says:

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

  7. Stanislav Bulgaria Google Chrome Windows Says:

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

  8. Demigod Bulgaria Google Chrome Windows Says:

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

  9. Stilgar Bulgaria Internet Explorer Windows Says:

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

  10. echeveria Bulgaria Mozilla Firefox Linux Says:

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

  11. Stanislav Bulgaria Google Chrome Windows Says:

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

  12. Stilgar Bulgaria Internet Explorer Windows Says:

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

Leave a Reply