2012-04-13 6 views
5

Nehmen wir Ich habe ein ArrayFunktioniert LINQ auf Index?

byte[] myarr = {1,4,3,4,1,2,1,2,4,3,1,4,2};  

myArr der Länge 13 sein wird (0-12 Index), die auch die Länge der int [] val sein wird.

int[] val = new int[13]; 

Ich möchte Index von myArr überprüfen, wo sein Wert 4 d 1,3,8,11.

dann will ich

val[1]++; 
val[3]++; 
val[8]++; 
val[11]++; 

Eine Möglichkeit, dies zu tun, ist für Schleife

for(int i=0; i<myarr.length; i++) 
{ 
    if(myarr[i] == 4) 
     val[i]++; 
} 

Wir können Array.indexOf verwenden, aber es gibt den ersten Index dieser Wert bedeutet, dass Wert auf sei einzigartig und mein myarr hat viele gleiche Werte.

Kann dies mit linq getan werden?

+5

Warum interessieren Sie sich für LINQ? Ihr Arbeitsbeispiel ist vollkommen einfach. Außerdem denke ich, das Beste, was du von LINQ bekommen könntest, wäre der tatsächliche Wert ... du müsstest es dann immer noch inkrementieren und es wieder dem Array zuweisen – musefan

+1

Das 'Q' in LINQ steht für Query. LINQ wird zum * Abfragen * von Daten verwendet. Sie möchten Daten * ändern *. Ihre for-Schleife ist der Weg, dies zu tun. –

+1

@GrahamClark: Mögliche Idee für LINC? .... Wer ist dabei? – musefan

Antwort

3

Dies ist, was ich in LINQ tun endete (Update enthalten):

myarr.Select((b, i) => b == 4 ? i : -1) 
    .Where(i => i != -1) 
    .ToList().ForEach(i => val[i]++); 

Ihre nicht-LINQ-Version natürlich viel mehr prägnant und lesbar ist, also denke ich, dass verwenden soll.

+0

Es muss 'ForEach (i => val [i] ++)' Ich nehme an .. –

+0

@PetrAbdulin das ist richtig, ich reparierte das Codebeispiel. Vielen Dank! – GolfWolf

+0

@ w0lf: Was ist mit -1 Bedingung an zwei Stellen? –

1

können Sie einen anonymous type verwenden, um die index zu speichern:

int[] newIndices = myarr.Select((i, index) => new { Index = index, Value = i }) 
      .Where (x => x.Value == 4) 
      .Select(x => x.Index + 1) 
      .ToArray(); 

bearbeiten: Endlich habe ich Ihre Frage verstanden;)

myarr.Select((i, index) => new { Index = index, Value = i }) 
       .Where(x => x.Value == 4) 
       .Select(x => x.Index) 
       .ForEach(i => myarr[i]++); 
+1

Wo ist der Inkrementteil? –

+0

@ L.B: Lesen Sie nur diesen Teil, korrigiert. –

+0

Erzeugt ein neues Array, anstatt das vorhandene 'val' zu ändern. –

2

Sie können, aber es wird nicht einfacher. LINQ wird Ihnen nur bei dem Abfrageteil helfen, der Aktualisierungsteil muss in einer Foo-Schleife erfolgen, aber da das Array Werttypen enthält, müssen Sie Indizes von Ihrer LINQ-Abfrage und nicht die tatsächlichen Werte erhalten, und Sie haben nichts gewonnen.