Je sais que c # a Array.FindAll
et Array.IndexOf
.
Existe-t-il un Array.FindAllIndexOf
qui retourne int[]
?
string[] myarr = new string[] {"s", "f", "s"};
int[] v = myarr.Select((b,i) => b == "s" ? i : -1).Where(i => i != -1).ToArray();
Cela retournera 0, 2
Si la valeur n'existe pas dans le tableau, il retournera un int [0].
en faire une méthode d'extension
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();
}
}
et l'appelle comme
string[] myarr = new string[] {"s", "f", "s"};
int[] v = myarr.FindAllIndexof("s");
Vous pouvez écrire quelque chose comme:
string[] someItems = { "cat", "dog", "purple elephant", "Unicorn" };
var selectedItems = someItems.Select((item, index) => new{
ItemName = item,
Position = index});
ou
var Items = someItems.Select((item, index) => new{
ItemName = item,
Position = index}).Where(i => i.ItemName == "purple elephant");
Recherche un élément qui correspond aux conditions définies par le prédicat spécifié et renvoie tout l'index de base zéro de l'occurrence dans l'ensemble de System.Array.
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();
}
Non, il n'y en a pas. Mais vous pouvez écrire votre propre méthode extension .
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();
}
et ensuite, pour votre tableau, appelez-le.
Vous pouvez faire une boucle avec findIndex en donnant un index
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);
Vous pouvez résoudre ce problème en ne créant que 2 variables entières. Plus de pouvoir pour vous!
string[] seasons= { "Fall","Spring", "Summer", "Fall", "Fall", "Winter"};
int i = 0;
int IndexOfFallInArray = 0;
int[] IndexesOfFall= new int[seasons.Length];
foreach (var item in seasons)
{
if (item == "Fall")
{
IndexesOfFall[i] = IndexOfFallInArray;
i++;
}
IndexOfFallInArray++;
}
J'ai utilisé la réponse de Nikhil Agrawal pour créer la méthode associée suivante, ce qui peut être utile.
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;
}
Ce qui prend une liste avec des valeurs et une liste avec des valeurs à faire correspondre. Il retourne une liste d'entiers avec l'index des correspondances.