2017-05-03 10 views
1

ich diesen String-Array haben:Erste alle Indizes der passenden Elemente in String-Array

string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" }; 
string value = "v2"; 

zurück Wie alle Indizes aller Vorkommen Wert im Array zu bekommen?

so für dieses Beispiel sollten wir ein Array von int = [1,3] vorzugsweise ohne Schleifen erhalten.

Antwort

4

Das stimmt. Es gibt keine Methode in der Array-class oder Erweiterungsmethode in Enumerable-class, die alle Indizes für ein bestimmtes Prädikat zurückgibt. So, hier ist eins:

public static IEnumerable<int> FindIndexes<T>(this IEnumerable<T> items, Func<T, bool> predicate) 
{ 
    int index = 0; 
    foreach (T item in items) 
    { 
     if (predicate(item)) 
     { 
      yield return index; 
     } 

     index++; 
    } 
} 

Hier ist Ihre Probe:

string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" }; 
string value = "v2"; 

int[] allIndexes = stringArray.FindIndexes(s => s.Contains(value)).ToArray(); 

Es verzögerte Ausführung verwendet, so dass Sie alle Indizes nicht verbrauchen müssen, wenn Sie nicht wollen.

4

Sie können die LINQ Where Extension-Methode verwenden, um zu filtern, und Select den Index zu erhalten:

int[] indexesMatched = stringArray.Select((value, index) => new { Value = value, Index = index } 
            .Where(x => x.Value.Contains("v2")) 
            .Select(x => x.Index) 
            .ToArray(); 
+2

Wow, danke! Ich hatte keine Ahnung, dass die '.Select()' Methode eine Überladung hatte, die den Index auch im Selektor unterstützte: 'Wählen Sie (diese IEnumerable Quelle, Func Selektor)' – degant

2

Linq Ansatz

string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" }; 
string value = "v2"; 

int[] result = stringArray.Select((x, i) => x.Contains(value) ? i : -1) 
          .Where(x => x != -1) 
          .ToArray(); 
+1

Sie könnte SelectMany anstelle von Select verwenden und Where überspringen. –

1

gleiches Ergebnis mit Select gefolgt von Wo:

var indexes = stringArray.Select((x,i) => x.Contains(searchStr)? i.ToString() : "") 
         .Where(x=> x!="").ToList(); 

Working example

Verwandte Themen