2009-11-05 7 views
5

は、このコード:私はこれらのような結果を得るように、私は、インデックス/カウントは "#" を置き換えることができますどのようにLINQ選択内でループインデックスにアクセスするにはどうすればよいですか?

Argentina has 3 customers: #. Cactus Comidas para llevar, #. Océano Atlántico Ltda., #. Rancho grande 
Austria has 2 customers: #. Ernst Handel, #. Piccolo und mehr 
Belgium has 2 customers: #. Maison Dewey, #. Suprêmes délices 
Brazil has 9 customers: #. Comércio Mineiro, #. Familia Arquibaldo, #. Gourmet Lanchonetes, #. Hanari Carnes, #. Que Delícia, #. Queen Cozinha, #. Ricardo Adocicados, #. Tradição Hipermercados, #. Wellington Importadora 
Canada has 3 customers: #. Bottom-Dollar Markets, #. Laughing Bacchus Wine Cellars, #. Mère Paillarde 
Denmark has 2 customers: #. Simons bistro, #. Vaffeljernet 
... 

var customers = from cust in Customers 
    group cust by new {cust.Country} into grouping 
    select new 
    { 
     Country = grouping.Key.Country, 
     Customers = grouping 
    }; 

customers.ToList().ForEach(g => 
    Console.WriteLine("{0} has {1} customers: {2}", 
     g.Country, 
     g.Customers.Count(), 
     String.Join(", ",g.Customers.Select(x => "#. " + x.CompanyName).ToArray()) 
    )); 

customers.Dump(); 

は、これらの結果が得られ

Argentina has 3 customers: 1. Cactus Comidas para llevar, 2. Océano Atlántico Ltda., 3. Rancho grande 
... 

答えて

11
customers.ToList().ForEach(g => Console.WriteLine("{0} has {1} customers: {2}", 
    g.Country, 
    g.Customers.Count(), 
    string.Join(", ", 
     g.Customers.Select((x, i) => i + ". " + x.CompanyName).ToArray()))); 
+0

非常に興味深い、動作しますが、私が実際にインクリメントされていますか? –

+1

@エドワード:これを見てください。 LINQ SELECTに2つのパラメータlambdaを使用して説明しています。 http://weblogs.asp.net/fmarguerie/archive/2008/11/10/using-the-select-linq-query-operator-with-indexes.aspx –

+1

@Edward、私はSelect拡張機能で内部的にインクリメントされています新しい値が各値に対して渡されます。 – JaredPar

2

int x = 0;を作成してみてください。あなたのlinqステートメントの前に。次に、print(x ++)。ToString()の中で。

これにより、xが閉じます。

+0

非常に実用的です。私のプロジェクトでは、1歳以上から数える必要があります。 – Roland

+0

@ LukeHの答えはいいですね。あなたは 'i'の代わりに'(i + 1) 'を使うことができるので、1ベースになります。 –

+0

良い答えは?おそらく、視覚的にもっと複雑なものになります。私の非データベースプロジェクトでは、たくさんの 'new XElement'を持つ大きなlinq構造体を使用すると、' .Select'はあまり便利ではなく、他の答えがより適用可能です。おそらくlinqの私の理解の欠如のために... – Roland

1

あなたはイテレータインデックス値を検索するためにこれを行うことができます:

var customers = from cust in Customers 
//Get Current Index 
let currIndex = Customers.IndexOf(cust) 
//You can then make use of the index in the Variable currIndex 
+0

それはすべての反復のための検索を行うために少し後方ですが、これは全く問題ではありません小さなプロジェクトのために。私の現在のプロジェクトでは、添付ファイルのリストを作成する必要があります。アイテムの数は非常に少なく、まれに5 – Roland

関連する問題