c# Array.FindAllIndexOf 其中 FindAll IndexOf

问题描述 投票:0回答:11

我知道 c# 有

Array.FindAll
Array.IndexOf

是否有一个

Array.FindAllIndexOf
返回
int[]

c# arrays indexof
11个回答
47
投票
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");

7
投票

你可以这样写:

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");

阅读使用 LINQ 获取给定项目的索引


5
投票

搜索与指定谓词定义的条件匹配的元素,并返回整个 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();
}

5
投票

我知道这是一篇旧帖子,但你可以尝试以下操作,

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

返回 {1,4,5} 作为列表


2
投票

不,没有。但你可以编写自己的扩展方法

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

然后,对于您的数组,调用它。


1
投票

您可以使用 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);

0
投票

我使用 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
投票

您可以通过仅创建 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++;
}

0
投票

简单地说:

public static IEnumerable<int> Available()
    {
        for (int i = 0; i < myarr.Length; i++)
        {
            if (myarr[i] is null) //Your predicate here...
                yield return i;
        }
    }

0
投票
// requirement for list
// using System.Collections.Generic;

// Assuming an array of strings
// Example array to search in
string[] array = new string[] { "test1", "test2", "test5", "test1", "test0", "test3" };

// Example string to search for
string search = "test1";

List<int> AllIndexes = new List<int>();
for (int i = 0; i < array.Length; i++)
{
    int f = Array.IndexOf(array[i..], search);
    if (f == -1) { break; }
    AllIndexes.Add(f+i);
    i += f;
}
int[] AllIndexesArray = AllIndexes.ToArray();

由于

IndexOf
找到第一次出现,我们可以使用简单的
for
循环来迭代结果并将它们添加到列表中。直接使用数组应该也可以,但我相信使用列表更容易。这还取决于您想对结果做什么。

这可能比其他解决方案需要更多代码,但根据您正在做的事情(例如循环结果),这可能是理想的解决方案。

注意:范围索引 (

[i..]
) 自 DotNet 5 起就存在。

函数可能如下所示:

public static int[] FindAllIndexOf<T>(T[] array, T value)
{
    List<int> AllIndexes = new List<int>();
    for (int i = 0; i < array.Length; i++)
    {
        int f = Array.IndexOf(array[i..], value);
        if (f == -1) { break; }
        AllIndexes.Add(f+i);
        i += f;
    }
    return AllIndexes.ToArray();
}

或者,使用 Jawid Hassim 解决方案:

public static IEnumerable<int> FindAllIndexOf<T>(T[] array, T value)
{
    for (int i = 0; i < array.Length; i++)
    {
        int f = Array.IndexOf(array[i..], value);
        if (f > -1)
            yield return f+i;
        else break;
        i += f;
    }
}

-1
投票

我知道问题已经得到解答,这只是另一种方法。请注意,我使用

ArrayList
而不是
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++;
}
© www.soinside.com 2019 - 2024. All rights reserved.