2012-05-04 7 views

Antwort

21
string[] myarr = new string[] {"s", "f", "s"}; 

int[] v = myarr.Select((b,i) => b == "s" ? i : -1).Where(i => i != -1).ToArray(); 

Dies wird 0 zurück, 2

Wenn der Wert im Array nicht vorhanden ist, wird ein int [0] zurückgegeben.

machen eine Verlängerung Methode davon es

public static class EM 
{ 
    public static int[] FindAllIndexof<T>(this IEnumerable<T> values, T val) 
    { 
     return values.Select((b,i) => object.Equals(b, val) ? i : -1).Where(i => i != -1).ToArray(); 
    } 
} 

und rufen wie

string[] myarr = new string[] {"s", "f", "s"}; 

int[] v = myarr.FindAllIndexof("s"); 
+2

Kürzere Art - 'Enumerable.Range (0, myarr.Length) .Where (i => myarr [i] ==" s ") ToArray();' – diesel

+0

@NikhilAgrawal Wie kann dies geändert werden, um alle zu finden Indizes von Fließkommazahlen, die (innerhalb der Genauigkeit) einem bestimmten Wert entsprechen? – gwizardry

6

Sie können so etwas wie schreiben:

string[] someItems = { "cat", "dog", "purple elephant", "unicorn" }; 
var selectedItems = someItems.Select((item, index) => new{ 
    ItemName = item, 
    Position = index}); 

oder

var Items = someItems.Select((item, index) => new{ 
    ItemName = item, 
    Position = index}).Where(i => i.ItemName == "purple elephant"); 

lesen: Get the index of a given item using LINQ

1

Sie können Schleife mit findIndex

string[] arr = { "abc", "asd", "def", "abc", "lmn", "wer" }; 
int index = -1; 
do 
{ 
    index = Array.IndexOf(arr, "abc", index + 1); 
    System.Console.WriteLine(index); 
} while (-1 != index); 
2

ein Index geben Nein, es nicht ist. Aber Sie können Ihre eigenen extension method schreiben.

public static int[] FindAllIndexOf<T>(this T[] a, Predicate<T> match) 
{ 
    T[] subArray = Array.FindAll<T>(a, match); 
    return (from T item in subArray select Array.IndexOf(a, item)).ToArray(); 
} 

und dann für Ihr Array, rufen Sie es an.

3

Sucht nach einem Element, das den vom angegebenen Vergleichselement definierten Bedingungen entspricht, und gibt den gesamten nullbasierten Index des Vorkommens im gesamten System.Array zurück.

public static int[] FindAllIndex<T>(this T[] array, Predicate<T> match) 
{ 
    return array.Select((value, index) => match(value) ? index : -1) 
      .Where(index => index != -1).ToArray(); 
} 
-2

Ich bin mir bewusst, dass die Frage bereits beantwortet wird, dies ist nur eine andere Möglichkeit, es zu tun. beachten Sie, dass ich ArrayList statt int[]

// required using directives 
using System; 
using System.Collections; 

String  inputString = "The lazy fox couldn't jump, poor fox!"; 
ArrayList locations = new ArrayList();  // array for found indexes 
string[] lineArray = inputString.Split(' ');  // inputString to array of strings separated by spaces 

int tempInt = 0; 
foreach (string element in lineArray) 
{ 
    if (element == "fox") 
    { 
     locations.Add(tempInt); // tempInt will be the index of current found index and added to Arraylist for further processing 
    } 
tempInt++; 
} 
0

verwendet habe ich Nikhil Agrawal Antwort verwendet, um die folgenden verwandten Verfahren zu schaffen, die nützlich sein können.

public static List<int> FindAllIndexOf<T>(List<T> values, List<T> matches) 
    { 
     // Initialize list 
     List<int> index = new List<int>(); 

     // For each value in matches get the index and add to the list with indexes 
     foreach (var match in matches) 
     { 
      // Find matches 
      index.AddRange(values.Select((b, i) => Equals(b, match) ? i : -1).Where(i => i != -1).ToList()); 

     } 

     return index; 
    } 

Das nimmt eine Liste mit Werten und eine Liste mit Werten, die übereinstimmen sollen. Es gibt eine Liste von ganzen Zahlen mit dem Index der Übereinstimmungen zurück.