2011-01-19 82 views
0
string[] fruits = { "apple", "banana", "mango", "orange", 
         "passionfruit", "grape" }; 

var query = 
    fruits.Select((fruit, index) => 
         new { index, str = fruit.Substring(0, index) }); 

foreach (var obj in query) 
{ 
    Console.WriteLine("{0}", obj); 
} 

/* 
This code produces the following output: 

{index=0, str=} 
{index=1, str=b} 
{index=2, str=ma} 
{index=3, str=ora} 
{index=4, str=pass} 
{index=5, str=grape} 
*/ 

有人可以解释一下,“索引”是如何作为元素的数组索引关联的?Lambda表达式问题

说,我需要一个查询,而不是第一个字母返回整个对象(在这种情况下字符串)+关联的索引。

+0

你是什么意思“说,我需要一个查询,而不是第一个字母返回我整个对象(在这种情况下字符串)。” – 2011-01-19 13:29:50

+1

我假设你要么学习语法,要么实际上需要更复杂的东西。否则,我假设你会使用一个简单的`foreach(var fruit in fruits)`循环并且完全跳过LINQ语法。 – 2011-01-19 13:35:33

回答

3

index变量只是一个计数器,从0开始递增,在遍历fruits的列表中。在此示例中,index与中的位置之间存在自然关系,因为您一次只能遍历fruits一个元素。

我不确定你有关访问“整个对象”的问题。你已经可以访问此:

var query = fruits.Select((fruit, index) => new { index, fruit }); 

fruit指的是目前的元素fruits,你通过它迭代。

1

要返回整个串中的每个情况下,只需修改查询从而:

var query = 
    fruits.Select((fruit, index) => 
        new { index, str = fruit }); 

index,只是,数组元素的索引。

1

不太清楚你问什么,但尝试:

string[] fruits = { "apple", "banana", "mango", "orange", 
         "passionfruit", "grape" }; 

var query = 
    fruits.Select((fruit, index) => 
         new { index, str = fruit }); 

foreach (var obj in query) 
{ 
    Console.WriteLine("{0}", obj); 
} 

指数是选择过载用来描述你的拉姆达目前遍历对象的索引。

1

这就是Select的特定超载的工作原理:“函数的第二个参数表示源元素的索引”

如果你想整个字符串,那么你可以做这样的事情:

var query = fruits.Select((fruit, index) => new { index, str = fruit }); 
1

Lambda表达式填充第一个变量名作为项目本身,第二个作为指数。

所以,如果你有(fruit,index),则:

水果=数据对象。

index =数组中的索引。

0

也许打破这是什么表情也将帮助你了解它:

fruits.Select((fruit, index) => 
        new { index, str = fruit.Substring(0, index) }); 

Select(...) =有输入,返回一个输出中表示。

(fruit, index) =将所选水果分配给变量fruit,并将索引(在Enumerable中的位置)分配到index。如前所述,这只是您可以使用的一种超载(选项)。如果您不关心索引值,只需省略即可。

=> =返回下面的值

new { ... } =创建匿名类型的一个实例。此类型将具有两个属性:indexstrindex的值将是变量indexstr的值将是水果子串的结果。

所以,如果你只是想果子,你可以重写它像这样:

fruits.Select(fruit => fruit); 

如果您仍然希望指数,与水果的全名:

fruits.Select((fruit, index) => 
        new { index, str = fruit}); 

选择对于从输入内容返回一组不同的信息是很有用的。

通过举例的方式用一个稍微复杂的场景:

举例来说,如果你有类,像这样:

public class Customer { 
public int Id {get; set;} 
public string Name { get; set;} 
public List<Order> Orders { get; set;} 
} 

public class Order { 
public int Id { get;set;} 
public double TotalOrderValue { get;set} 
} 

你可以使用一个简单的SELECT语句返回客户,和多少客户曾经下令总和:

var customersTotalSpend = customers.Select(
     customer => 
     new { 
      customer, 
      TotalSpend = customer.Orders.Select(order => order.TotalOrderValue).Sum() 
      }); 

然后我们可以做一些与TotalSpend值,如果我们想要的,如获得10名最大的消费者:

var biggestCustomers = customersTotalSpend.OrderByDescending(customerSpend=> customer.TotalSpend).Take(10); 

现在有道理吗?