2009-11-05 12 views
5

ten kod:Jak mogę uzyskać dostęp do indeksu pętli wewnątrz wybierz LINQ?

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(); 

daje wyniki:

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 
... 

Jak mogę wymienić "#" z indeksem/liczby, tak aby uzyskać wyniki takie jak:

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

Odpowiedz

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

Bardzo ciekawe, że działa, gdzie jest i jest zwiększany w rzeczywistości? –

+1

@Edward: Spójrz na to. Wyjaśnia LINQ SELECT z dwoma parametrami lambda. http://weblogs.asp.net/fmarguerie/archive/2008/11/10/using-the-select-linq-query-operator-with-indexes.aspx –

+1

@Edward, I jest inkrementowany wewnętrznie w rozszerzeniu Select metoda i nowa wartość jest przekazywana dla każdej wartości. – JaredPar

2

Spróbuj utworzyć int x = 0; przed twoim zdaniem linq. Następnie wewnątrz, wydrukuj (x ++). ToString().

Spowoduje to zamknięcie x.

+0

Bardzo praktyczne, zwł. w moim projekcie, w którym muszę liczyć od 1 wzwyż. – Roland

+0

@ Odpowiedź LukeH jest lepsza, prawda? Możesz po prostu użyć '(i + 1)' zamiast po prostu 'i', więc bądź oparty na 1. –

+0

lepsza odpowiedź? Być może, ale także wizualnie bardziej złożony. Dla mojego projektu bez bazy danych, używając dużej struktury linq z mnóstwem 'nowego XElement',' .Select' nie jest bardzo przydatny, a inne odpowiedzi są bardziej odpowiednie. Być może z powodu braku zrozumienia linq ... – Roland

1

można to zrobić w celu poszukiwania wartości indeksu iteratora:

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

Jest to trochę wstecz, aby wyszukać każdą iterację, ale w przypadku małych projektów nie stanowi to żadnego problemu. W moim bieżącym projekcie muszę utworzyć listę załączników do wiadomości e-mail, a liczba pozycji jest bardzo niska, rzadko przekraczana, powiedzmy, 5 – Roland

Powiązane problemy