2009-11-05 7 views
5

Dieser Code:Wie kann ich auf den Schleifenindex innerhalb einer LINQ-Auswahl zugreifen?

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

liefert diese Ergebnisse:

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

Wie kann ich den "#" mit einem Index/Zählung ersetzen, so dass ich Ergebnisse wie diese bekommen:

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

Antwort

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

Sehr interessant, das funktioniert, wo ich tatsächlich erhöht wird? –

+1

@Edward: Schau dir das an. Es erklärt den LINQ SELECT mit einem Lambda mit zwei Parametern. http://weblogs.asp.net/fmarguerie/archive/2008/11/10/using-the-select-linq-query-operator-with-indexes.aspx –

+1

@ Edward, ich wird intern in der Select-Erweiterung inkrementiert Methode und der neue Wert wird für jeden Wert übergeben. – JaredPar

2

Versuchen Sie einen int x = 0; vor Ihrer Linq-Anweisung. Dann, innerhalb, print (x ++). ToString().

Dadurch wird x zu einem Abschluss.

+0

Sehr praktisch, insb. in meinem Projekt, wo ich ab 1 zählen muss. – Roland

+0

@ LukeHs Antwort ist besser, aber, oder? Du könntest einfach '(i + 1)' statt nur 'i' verwenden, also sei 1-basiert. –

+0

eine bessere Antwort? Vielleicht, aber auch optisch komplexer. Für mein Nicht-Datenbank-Projekt, das eine große Linq-Struktur mit vielen 'neuen XElement' verwendet, ist das' .Select' nicht sehr praktisch, und die anderen Antworten sind eher anwendbar. Vielleicht, weil ich kein Verständnis für linq habe ... – Roland

1

Sie können dies tun, um für den Iterator Indexwert zu suchen:

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

Es ist ein bisschen rückwärts, nach jeder Iteration zu suchen, aber für kleine Projekte ist das überhaupt kein Problem. In meinem aktuellen Projekt muss ich eine Liste von Mailanhängen erstellen, und die Anzahl der Elemente ist sehr niedrig, selten über, sagen wir, 5 – Roland

Verwandte Themen