Ich weiß C# hat Array.FindAll
und Array.IndexOf
.C# Array.FindAllIndexOf welche FindAll IndexOf
Gibt es eine Array.FindAllIndexOf
, die int[]
zurückgibt?
Ich weiß C# hat Array.FindAll
und Array.IndexOf
.C# Array.FindAllIndexOf welche FindAll IndexOf
Gibt es eine Array.FindAllIndexOf
, die int[]
zurückgibt?
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");
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");
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);
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.
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();
}
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++;
}
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.
Kürzere Art - 'Enumerable.Range (0, myarr.Length) .Where (i => myarr [i] ==" s ") ToArray();' – diesel
@NikhilAgrawal Wie kann dies geändert werden, um alle zu finden Indizes von Fließkommazahlen, die (innerhalb der Genauigkeit) einem bestimmten Wert entsprechen? – gwizardry