Quando usar um método de extensão com lambda sobre LINQtoObjects para filtrar uma coleção?

votos
11

Estou prototipagem alguns filtros de recolha de C # 3 e me deparei com este. Eu tenho uma coleção de produtos:

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?
    }
};

Agora, se eu usar LINQ para filtrar ele funciona como esperado:

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

E se eu usar o método de extensão Onde combinado com um Lambda o filtro funciona assim:

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

Pergunta: Qual é a diferença, e por que usar um sobre o outro?

Publicado 07/08/2008 em 20:23
fonte usuário
Em outras línguas...                            


4 respostas

votos
5

LINQ se transforma em chamadas de método como o código que você tem.

Em outras palavras, não deve haver nenhuma diferença.

No entanto, em seus dois pedaços de código que você não está chamando .ToList no primeiro, então o primeiro pedaço de código irá produzir uma fonte de dados enumeráveis, mas se você chamar .ToList sobre ele, os dois devem ser o mesmo.

Respondeu 07/08/2008 em 20:25
fonte usuário

votos
4

Como mencionado d será IEnumerable<MyProduct>enquanto é fList<MyProduct>

A conversão é feita pelo compilador C #

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

É convertido em (antes da compilação para IL e com os genéricos expandido):

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

Note que neste caso simples faz pouca diferença. Onde Linq torna-se realmente valioso é em loops muito mais complicadas.

Por exemplo esta declaração poderia incluir grupos-bys, pedidos e algumas declarações let e ainda ser legível em formato Linq quando o equivalente .Method().Method.Method()iria ficar complicado.

Respondeu 11/08/2008 em 13:52
fonte usuário

votos
0

A sintaxe que você está usando para d vai ser transformado pelo compilador na mesma IL como os métodos de extensão. A sintaxe "SQL-like" é suposto ser uma maneira mais natural para representar uma expressão LINQ (embora eu, pessoalmente, prefiro os métodos de extensão). Como já foi referido, o primeiro exemplo irá retornar um resultado IEnumerable enquanto o segundo exemplo irá retornar uma lista dos resultados devido à chamada para ToList (). Se você remover a chamada ToList () no segundo exemplo, eles irão devolver o mesmo resultado que Onde retorna um resultado IEnumerable.

Respondeu 17/08/2008 em 05:35
fonte usuário

votos
0

Outros do que a diferença ToList, # 2 é muito mais legível e natural IMO

Respondeu 08/08/2008 em 05:19
fonte usuário

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