回答
下面是一个示例。希望它澄清一切:
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
}
关键是,选择()可以选择任何类型的对象。确实,您可以选择任何通用值分配给您的集合的属性,但您也可以选择任何其他类型的对象。 SelectMany()只是展平你的列表。
SelectMany返回一个对象数量为每个传递到表达式的对象。对于传递到表达式的每个对象,Select istead会返回一个单个对象。
引述的文档:
选择许多
项目的序列中的每个元素到IEnumerable <(OF <(T>)>),将所得序列合并为一个序列。
选择
项目的序列中的每个元素到一个新的形式。
如果要平坦化层次结构,则可以使用SelectMany
。例如。如果你有Orders
和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);
OrderDetails必须是Orders对象中OrderDetails类型的字段,对吗? – dotnetdev 2010-03-11 14:57:22
在这个例子中......是的。 :-) – AxelEckenberger 2010-03-11 14:59:23
让我们依次去了你的问题:在集合中
1.是否选择返回一个元素? - >不,绝对不是。 '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>())?
- >是的,但实际上,它就像我们控制的交叉连接。
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两个集合,而不是一个。
- “偶数”是第一个集合,奇数是第二个集合,我们使用lambda传递的是'n => odd'。 (这是人们说它变平的地方)
- 第三个参数(在上面的语句中,第二个参数)是TResult,它给出了交叉连接的输出,如果我们理解它的话,这就是SelectMany的美。
- 享受学习。
- 1. css选择器的区别?
- 2. 选择计数区别
- 3. 在选择框中选择并取消选择多个选项
- 4. LINQ选择许多问题
- 5. 选择多只允许一个选择某些选项
- 6. 只允许在选择框中选择一个选项多个
- 7. CSS多个类别选择
- 8. 阵营,选择不清除当前的选择,并允许空值来选择
- 9. 选择区别于其他选择结果
- 10. jquery选择器和js选择器有什么区别?
- 11. 不允许选择的值被选择
- 12. MySQL的选择多选择
- 13. Radiobuttonlist在视觉上允许多个选择并锁定到第一个选择
- 14. 选择区域
- 15. Python的OptionParser允许选择类型选择多个参数
- 16. 停止选择框多个允许用户选择多个选项
- 17. Kendo UI多选择下拉菜单并选择所有选项
- 18. 选择多个选项,并选择值会从Excel
- 19. Odoo许多2个多选择域
- 20. 选择多到许多教义DQL 2.0
- 21. 选择多到许多与GROUP_CONCAT
- 22. 修复选择区域并停止jcrop中的新选择
- 23. 加入并选择多列
- 24. 查找并选择多行
- 25. 多选择选择器视图不能有一个比别人
- 26. mysql保存并选择很多选项
- 27. 同类jQuery选择之间的区别
- 28. 这些选择器有什么区别?
- 29. 在WPF中区别选择和拖动
- 30. 从sql号码列中区别选择
复制问题 - 请参阅http://stackoverflow.com/questions/958949/difference-between-select-and-selectmany以获得很好的答案。 – 2010-03-11 14:20:25