多次获取数组的索引,然后将它们存储在数组中 C#

getting the index of an array, multiple times, then storing them in an array c#

我想获取我用 Array.IndexOf(array, value) 完成的数组的索引。这适用于一个值,但我想获取每次出现的值并将索引存储到另一个数组中。比如名字'tom'在一个数组中出现了5次,我想求出每一次的索引位置

也许是这样的?这使用列表而不是数组,但它遵循相同的想法。

List<int> Indexes = new List<int>();

for (int i = 0; i < array.Count(); i++)
{
    if (array[i] == "tom")
    {
        Indexes.Add(i);
    }
}

您可以使用 LINQ 的 Select 重载,它也使用元素索引,例如:

var indices = stringArray.Select((s, i) => new {Value = s, Index = i})
    .Where(r => r.Value == "tom")
    .Select(r => r.Index);

如果我没记错的话,您可以向 IndexOf() 添加另一个参数,这样您就可以指定数组中的起始位置。这应该能或多或少地满足您的需求:

var indices = new List<int>();
int i = Array.IndexOf(array, val);
while(i > -1){
    indices.Add(i);
    i = Array.IndexOf(array, val, i+1);
} 

// ... and if it is important to have the result as an array:
int[] result = indices.ToArray();

实际例子:

var array = new int[]{ 1, 2, 3, 3, 4, 5, 3, 6, 7, 8, 3};
int val = 3;

var indices = new List<int>();    
int i = Array.IndexOf(array, val);
while(i > -1){
    indices.Add(i);
    i = Array.IndexOf(array, val, i+1);
}

// ... and if it is important to have the result as an array:
int[] result = indices.ToArray();

编辑: 刚刚意识到 while 循环可能比 for 循环更简洁。


编辑2:由于大众需求(见下面的评论),这里是原来漂亮的非基本for循环,重新引入刚刚为了您的阅读乐趣:

for(int i = Array.IndexOf(array, val); i > -1; i = Array.IndexOf(array, val, i+1)){
    indices.Add(i);        
} 

可以创建一个扩展方法来做到这一点

namespace Extensions
{
    public static class ArrayExtension
    {
        public static IEnumerable<int> GetIndicesOf<T>(this T[] target, T val, int start = 0)
        {
            EqualityComparer<T> comparer = EqualityComparer<T>.Default;
            for (int i = start; i < target.Length; i++)
            {
                if (comparer.Equals(target[i], val))
                {
                    yield return i;
                }
            }
        }
    }
}

在要调用它的文件中使用扩展方法using Extensions;为您的命名空间添加 using 语句。

然后调用它只需执行以下操作以获取索引。

IEnumerable<int> indices = array.GetIndicesOf(value);

或者获取一个数组只需要

int[] indicies = array.GetIndicesOf(value).ToArray();

此解决方案与前一个解决方案类似,但 运行 速度更快:

string value = "tom";
int[] indices = stringArray.Where(s => s != null)
                           .Select((s, i) => s.Equals(value) ? i: -1)
                           .Where(i => i >= 0)
                           .ToArray();