选择并选择许多差异

时间:2010-03-11 14:13:31

标签: linq

我已经在select上读了很多站点/线程,在LINQ中选择了很多但仍然不太明白。

select是否返回集合中的一个元素并选择多个展平集合(例如List>())?

由于

3 个答案:

答案 0 :(得分:5)

这是一个样本。希望它澄清一切:

static void MethodRun()
{
    List<Topping> testToppings = new List<Topping> { Topping.Cheese, Topping.Pepperoni, Topping.Sausage };

    var firstLetterofToppings = testToppings.Select(top => top.ToString().First());

    // returns "C, P, S"

    var singleToppingPizzas = testToppings.Select(top => new Pizza(top)).ToArray();

    // returns "Pizza(Cheese), Pizza(Pepperoni), Pizza(Sausage)"

    List<Topping> firstPizza = new List<Topping> { Topping.Cheese, Topping.Anchovies };
    List<Topping> secondPizza = new List<Topping> { Topping.Sausage, Topping.CanadianBacon, Topping.Pepperoni };
    List<Topping> thirdPizza = new List<Topping> { Topping.Ham, Topping.Pepperoni };

    List<IEnumerable<Topping>> toppingsPurchaseOrder = new List<IEnumerable<Topping>> { firstPizza, secondPizza, thirdPizza };

    var toppingsToOrder = toppingsPurchaseOrder.SelectMany(order => order);

    //returns "Cheese, Anchovies, Sausage, CanadianBacon, Pepperoni, Ham, Pepperoni"

}

class Pizza
{
    public List<Topping> Toppings { get; private set; }
    public Pizza(Topping topping) : this(new List<Topping> { topping }) { }
    public Pizza(IEnumerable<Topping> toppings)
    {
        this.Toppings = new List<Topping>();
        this.Toppings.AddRange(toppings);
    }
}

enum Topping
{
    Cheese,
    Pepperoni,
    Anchovies,
    Sausage,
    Ham,
    CanadianBacon
}

关键是Select()可以选择任何类型的对象。确实,您可以选择分配给集合的任何通用值的属性,但您也可以选择任何其他类型的对象。 SelectMany()只会展开你的列表。

答案 1 :(得分:3)

SelectMany为传递给表达式的每个对象返回个对象。 Select aretead为传递给表达式的每个对象返回单个对象

引用文档:

选择许多

  

将序列的每个元素投影到IEnumerable&lt;(Of&lt;(T&gt;)&gt;)并将得到的序列展平为一个序列。

选择

  

将序列的每个元素投影到新表单中。

如果要展平层次结构,可以使用SelectMany。例如。如果您有OrdersOrderDetails。如果您想根据订单进行选择,但希望作为回报OrderDetails使用SelectMany

var result = db.Orders
               .Where(x => x.CustomerId == 500)  // input to next expression is IEnumerable<Order>
               .SelectMany(x => x.OrderDetails)  // input to next expression is IEnumerable<OrderDetails>
               .Sum(x => x.PositionTotal);

var result = db.Orders
               .Where(x => x.CustomerId == 500)  // input to next expression is IEnumerable<Order>
               .Select(x => CustomerName);

答案 2 :(得分:0)

让我们按顺序回答你的问题:

<强> 1。 select会在集合中返回一个元素吗? - &GT;不,绝对不是。 'select'返回与集合中的元素数量完全相同的元素,但是返回不同的形状(如果需要)。

但是,是的,它返回一个包含所有这些元素的序列(/ collection)(例如,在下面的例子中为even_sqare)。

e.g
int[] even = {2,4}; int[] even_square = even.Select(n=> n*2).ToArray();

O / P
          even_square输出到{4,8}这与计数(2)完全相同,但是不同的投影,我们通过选择它们给出了每个的平方。

<强> 2。 &安培;选择多个展平集合(例如List&gt;())?

- &GT;是的,但实际上,它就像是我们控制的交叉连接。

 int[] odd = { 1, 3 };
 int[] even = { 2, 4 };

 int[] crossjoin = 
         even.SelectMany(
                n => odd, //combining even with odd
                (n,o)=>Convert.ToInt32(n.ToString()+o.ToString())//given many selects, decide our projection
              ).ToArray();

 foreach (var item in crossjoin)
 {
    Console.WriteLine(item);
 }

 Output: 21
         23
         41
         43

现在有一百万美元的东西:

  • 与linq中的大多数运算符不同,SelectMany采用两个集合,而不是一个。
  • “even”是第一个集合,而odd是第二个集合,我们使用lambda传递了这个'n =&gt;奇'。 (这是人们说它变平的地方)
  • 第三个参数(在上面的语句中,第二个参数)是TResult,它给出了交叉连接的输出,如果我们理解它就是SelectMany的美。
  • 享受学习。