2016-08-07 7 views
2

i eine Liste haben sagen:Wie den Index der nächsten passenden Element in der Liste finden LINQ mit

List<string> list = new List<string>(){"Oracle","SQL Server","Java","Oracle","Python"}; 

Jetzt versuche ich Index des zweiten „Oracle“ aus der Liste mit LINQ zu bekommen:

var indexFirefox = list.FindIndex(a => a.Text == "Oracle"); 

Aber das gibt Ihnen nur die erste Instanz, die Index 0 ist. Ich möchte Index als 4 in meinem Ergebnis. Will Skip-Hilfe benutzen oder es gibt eine einfachere Möglichkeit, den Index zu bekommen. Das obige Beispiel ist nur eine Demo, ich habe eine Liste mit über 300 Werten.

+1

können Sie [einen Startindex geben] (https://msdn.microsoft.com/en-us/library/efasdh0s.aspx) zu 'FindIndex'. Sie können also den ersten Index finden und dann den nächsten finden, indem Sie 'index + 1' übergeben. – Blorgbeard

+0

Ich habe viele solcher Vorkommnisse von übereinstimmenden Elementen, also könnte es helfen, den vorherigen Index zu bekommen und dann nach dem nächsten zu suchen. Lass mich das versuchen. Vielen Dank! –

Antwort

0
list.Where(x => x == "Oracle").ElementAt(1); 
  • stürzt ab, wenn ther keine zweite Fund ist, können Sie einfach die Größe des enumerable überprüfen, bevor das zweite Element zurück.
+0

Die Überprüfung der Größe von Aufzählungen erfordert mehrere Aufzählungen. Dies ist nicht die effizienteste Methode. Es ist wahrscheinlich besser, in diesem Fall einfach zu "fangen" oder eine andere Methode zu verwenden, die nicht geworfen wird. – Blorgbeard

0

hier finden i Index der nächsten Elementanpassung

list.Select((value, index) => new { value, index = index + 1 }).Where(x => x.value == "Oracle").Skip(1).FirstOrDefault().index 
0

Dies macht es für mich schön:

var result = 
    list 
     .Select((x, n) => new { x, n }) 
     .Where(xn => xn.x == "Oracle") 
     .Select(xn => xn.n) 
     .Skip(1) 
     .FirstOrDefault(); 

Dies gibt 3 den Eingang gegeben List<string> list = new List<string>(){"Oracle","SQL Server","Java","Oracle","Python"};.

3

So viele Linq Antwort, wenn es bereits eine Methode, den Job vorhanden ist (im ersten Kommentar gegeben)

List<T>.FindIndex eine overload hat, die einen zusätzlichen Indexparameter nimmt aus diesem Index nur zu suchen.

Um das zweite Vorkommen eines Elements zu erhalten, müssen Sie nur diese Überladung mit dem Ergebnis eines "normalen" FindIndex verwenden.
(Anmerkung: in Probe Ihre Frage des verwendeten Sie a.Text aber Artikel String sind, so dass keine Text-Eigenschaft ist)

var firstIndex = list.FindIndex (item => item == "Oracle"); 
if (firstIndex != -1) 
{ 
    var secondIndex = list.FindIndex (firstIndex, item => item == "Oracle"); 
    // use secondIndex (can be -1 if there is no second occurrence) 
} 

Und mit Ihrer Probe Beispiel secondIndex wird 3(und nicht 4 wie in Ihrem angegeben Frage, Indizes sind nullbasiert)

Alternativ können Sie, wenn Sie die Ereignisindizes der Reihe nach abrufen möchten, die gleiche Methode verwenden.

// defined here to not have to repeat it 
Predicate<string> match = item => item == "Oracle"; 

for (var index = list.FindIndex (match); index > -1; index = list.FindIndex (index + 1, match)) 
{ 
    // use index here 
} 

Oder wenn Sie eine while-Schleife

var index = list.FindIndex (match); 

while (index > -1) 
{ 
    // use index here 

    index = list.FindeIndex (index + 1, match); 
} 
Verwandte Themen