web-dev-qa-db-ja.com

c#Array.FindAllIndexOf which FindAll IndexOf

私はc#に Array.FindAll および Array.IndexOf があることを知っています。

Array.FindAllIndexOfを返すint[]はありますか?

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

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

これは0、2を返します

値が配列に存在しない場合は、int [0]を返します。

それの拡張メソッドを作る

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();
    }
}

そしてそれを

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

int[] v = myarr.FindAllIndexof("s");
29
Nikhil Agrawal

あなたは次のようなものを書くことができます:

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

または

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

ReadLINQ を使用して特定のアイテムのインデックスを取得します

6
Pranay Rana

指定された述語で定義された条件に一致する要素を検索し、System.Array全体で発生の0から始まるすべてのインデックスを返します。

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();
}
4
Rocket

いいえ、ありません。ただし、独自の 拡張メソッド を作成できます。

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();
}

そして、あなたの配列のために、それを呼び出します。

2
stukselbax

これは古い投稿であることは知っていますが、次のことを試してみてください。

string[] cars = {"Volvo", "BMW", "Volvo", "Mazda","BMW","BMW"};
var res = Enumerable.Range(0, cars.Length).Where(i => cars[i] == "BMW").ToList();

{1,4,5}をリストとして返します

1
Furkan Öztürk

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);
1
msam

この問題は、2つの整数変数のみを作成することで解決できます。あなたにもっと力を!

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++;
}

Nikhil Agrawalの回答を使用して、次の関連メソッドを作成しました。

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;
    }

これは、値のリストと一致する値のリストを取ります。一致のインデックスを持つ整数のリストを返します。

0
Henrik Larsen