我想得到我用Array.IndexOf(array, value)
完成的数组的索引。这适用于一个值,但我希望每次出现该值并将索引存储到另一个数组中。例如,名称' tom'在数组中出现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);