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

时间:2015-03-31 16:50:13

标签: c# arrays indexing indexof

我想得到我用Array.IndexOf(array, value)完成的数组的索引。这适用于一个值,但我希望每次出现该值并将索引存储到另一个数组中。例如,名称' tom'在数组中出现5次,我想找到每个数组的索引位置。

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

如果我没有弄错,你可以在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);        
} 

答案 3 :(得分:2)

可以创建一个扩展方法来执行此操作

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

答案 4 :(得分:1)

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

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