我已经在select上读了很多站点/线程,在LINQ中选择了很多但仍然不太明白。
select是否返回集合中的一个元素并选择多个展平集合(例如List>())?
由于
答案 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
。例如。如果您有Orders
和OrderDetails
。如果您想根据订单进行选择,但希望作为回报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
现在有一百万美元的东西: