我正在对一些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);

如果我使用Where扩展方法结合Lambda,过滤器也可以工作:

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

问题:有什么区别,为什么使用一个而不是另一个?

===============>>#1 票数:6 已采纳

LINQ变成了方法调用,就像你拥有的代码一样。

换句话说,应该没有区别。

但是,在你的两段代码中,你没有在第一段中调用.ToList,所以第一段代码会产生一个可枚举的数据源,但是如果你在它上面调用.ToList,那两个应该是相同的。

===============>>#2 票数:4

如上所述,d将是IEnumerable<MyProduct>而f是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变得非常有价值的地方是更复杂的循环。

例如,当等效的.Method().Method.Method()变得复杂时,这个语句可以包括group-bys,orders和一些let语句,并且仍然可以用Linq格式读取。

===============>>#3 票数:0

您用于d的语法将由编译器转换为与扩展方法相同的IL。 “SQL-like”语法应该是表示LINQ表达式的更自然的方式(尽管我个人更喜欢扩展方法)。 正如已经指出的那样,第一个示例将返回IEnumerable结果,而第二个示例将返回由于调用ToList()而导致的List结果。 如果在第二个示例中删除了ToList()调用,它们将返回与Where返回IEnumerable结果相同的结果。

===============>>#4 票数:0

除了ToList差异,#2更具可读性和自然IMO

  ask by KP. translate from so

未解决问题?本站智能推荐: