2011-01-19 15 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} 
*/ 

誰かが説明することができます、どのように "インデックス"ここで要素の配列のインデックスとして関連付けられていますか?ラムダ式質問

私は最初の文字の代わりに私にオブジェクト全体(この場合は文字列)+関連するインデックスを返すというクエリが必要です。

+0

「あなたが最初の文字の代わりに私にオブジェクト全体(この場合は文字列)を返すというクエリが必要です」とはどういう意味ですか? –

+1

私はあなたが構文を学んだりしようとしているとか、実際にもっと複雑なものが必要だと思っています。それ以外の場合は、単純な 'foreach(果実のvar fruit) 'ループを使用し、LINQ構文を完全にスキップすると仮定します。 –

+0

@Wonko the Sane:関連インデックスと対応するオブジェクトが必要です。 foreachが0から* count *まで、* count *から0まで、または無作為に繰り返すかどうかは不明です。 – serhio

答えて

3

index変数は、単にfruitsのリストを反復するときに0から増分するカウンタです。この例では、indexfruitの位置は、fruitsを一度に1つずつ繰り返しているので、fruitsに自然な関係があります。

「全体のオブジェクト」へのアクセスに関するご質問についてはわかりません。あなたは既にこのへのアクセス権を持って:あなたはそれを反復として

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

fruitfruits内の現在の要素を参照します。

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の特定のオーバーロードがどのように機能するかを示しています。"関数の2番目のパラメータは、ソース要素のインデックス"を表します。あなたは文字列全体をしたい場合は

は、あなたがこのような何かを行うことができます。

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

ラムダ式は、アイテム自体、及び指標としての第2のように最初の変数名が移入されます。

だから、その後、(fruit,index)を持っている場合:

フルーツ=データオブジェクトを。

index =配列内のインデックス。おそらく、この表現が何を壊し

0

は、あなたがそれを理解するのに役立ちます:

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

Select(...) =入力すると、内部に示されているように出力を返します。

(fruit, index) =変数fruitに選択した果物を割り当て、インデックス(Enumerableの位置)をindexに割り当てます。前述のように、これはあなたに利用可能な1つのオーバーロード(オプション)です。インデックス値を気にしない場合は、単に省略してください。

=> =は、匿名型のインスタンスを作成します。=次の値

new { ... }を返します。このタイプには、indexstrという2つのプロパティがあります。 indexの値は、変数indexになります。 strの値は果物の部分文字列の結果になります。

あなたは、単に果物をしたいのであれば、あなたはそうのようにそれを書き換えることができます:

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ステートメントを使用することができ

と顧客がこれまでに発注したことをどのくらいの合計は:私たちは、例えば、10件の最大の浪費家を取得したい場合

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

私たちは、そのTotalSpend値で何かを行うことができます:

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

今は意味がありますか?