Когда использовать метод расширения с лямбда над LINQtoObjects для фильтрации коллекции?

голоса
11

Я прототипирование некоторых фильтров коллекции C # 3 и наткнулся на это. У меня есть набор продуктов:

public class MyProduct
{
    public string Name { get; set; }
    public Double Price { get; set; }
    public string Description { get; set; }
}

var MyProducts = new  List<MyProduct>
{            
    new  MyProduct
    {
        Name = Surfboard,
        Price = 144.99,
        Description = Most important thing you will ever own.
    },
    new MyProduct
    {
        Name = Leash,
        Price = 29.28,
        Description = Keep important things close to you.
    }
    ,
    new MyProduct
    {
        Name = Sun Screen,
        Price = 15.88,
        Description = 1000 SPF! Who Could ask for more?
    }
};

Теперь, если я использую LINQ для фильтрации работает, как ожидалось:

var d = (from mp in MyProducts
             where mp.Price < 50d
             select mp);

И если я использую метод расширения Где в сочетании с лямбда-фильтр работает, а также:

var f = MyProducts.Where(mp => mp.Price < 50d).ToList();

Вопрос: В чем разница, и почему использовать один над другим?

Задан 07/08/2008 в 20:23
источник пользователем
На других языках...                            


4 ответов

голоса
5

LINQ превращается в вызовы методов, как код, который вы имеете.

Другими словами, не должно быть никакой разницы.

Тем не менее, в ваших двух кусков кода, не вызывая .ToList в первом, так что первая часть кода будет производить перечислимого источник данных, но если вы звоните .ToList на этом, два должны быть одинаковыми.

Ответил 07/08/2008 в 20:25
источник пользователем

голоса
4

Как уже упоминалось д будет в IEnumerable<MyProduct>то время как РList<MyProduct>

Преобразование выполняется с помощью C # компилятор

var d = 
    from mp in MyProducts
    where mp.Price < 50d
    select mp;

Преобразуются (до компиляции в IL и дженерик расширены):

var d = 
    MyProducts.
    Where<MyProduct>( mp => mp.Price < 50d ).
    Select<MyProduct>( mp => mp ); 
    //note that this last select is optimised out if it makes no change

Обратите внимание, что в этом простом случае это мало что меняет. Где Linq становится очень ценным в гораздо более сложных контуров.

Например , это заявление может включать группы снаряды, приказы и несколько заявлений пусть и по- прежнему быть читаемыми в формате Linq , когда эквивалент .Method().Method.Method()будет усложняться.

Ответил 11/08/2008 в 13:52
источник пользователем

голоса
0

Синтаксис вы используете для г будет трансформируются компилятором в то же IL , как и методы расширения. Синтаксис «SQL-подобный» должен быть более естественным способом представить выражение LINQ (хотя я лично предпочитаю методы расширения). Как уже отмечалось, первый пример возвращает IEnumerable результат в то время как второй пример возвратит результат списка в связи с вызовом ToList (). Если убрать вызов ToList () во втором примере, они возвращают один и тот же результат , как и где возвращает IEnumerable результат.

Ответил 17/08/2008 в 05:35
источник пользователем

голоса
0

Кроме разницы ToList, # 2 является намного более читаемым и естественно IMO

Ответил 08/08/2008 в 05:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more