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(); 
相關問題