2015-03-31 68 views
1

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

+4

这是一个任务,而不是一个问题。你有什么尝试?你面临什么问题? – Dmitry 2015-03-31 16:51:33

+2

(你可能想使用LINQ与'Where',btw ...) – 2015-03-31 16:53:33

+2

@JonSkeet如果他想要索引,他不会(在技术上他可以,因为哈比卜写的,但它是一个很大的弯路) – xanatos 2015-03-31 16:53:54

回答

3

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

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

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

您应该使用'.Length'而不是'.Count()' – xanatos 2015-03-31 17:08:49

+0

这很有效,我使用了.Length – Sup 2015-03-31 18:12:05

1

您可以使用LINQ的Select过载,它使用元素的索引,以及像:

var indices = stringArray.Select((s, i) => new {Value = s, Index = i}) 
    .Where(r => r.Value == "tom") 
    .Select(r => r.Index); 
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:由于大众需求(见下文评论),here`s原来的靓丽无基本的循环,只是重新引入您的阅读快感:

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

但是......非基本的'for “真是太棒了......”这是我在过去六个月中见过的最美丽的'for'之一......我只赞成你:-) – xanatos 2015-03-31 17:42:49

+1

@xanatos谢谢你,我感到很荣幸。事实上,我对你的评论非常感动,因此我决定重新引入原始的for循环。请享用! :) – Kjartan 2015-04-01 06:51:38

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语句命名空间w^ith扩展方法using Extensions;在您要调用它的文件中。

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

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

,或者得到一个数组只是做

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

该解决方案是像以前的一个,但运行速度更快:

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