多次获取数组的索引,然后将它们存储在数组中 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();
我想获取我用 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();