2011-01-19 81 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); 

現在有道理嗎?