假设我有这样一个数组
string [] fruits = {"watermelon","apple","apple","kiwi","pear","banana"};
是否有内置函数可以查询所有“apple”的索引? 例如:
fruits.FindAllIndex("apple");
将返回一个包含1和2的数组。
如果没有,我应该如何实现它?
谢谢!
LINQ版本:
var indexes = fruits.Select((value, index) => new { value, index })
.Where(x => x.value == "apple")
.Select(x => x.index)
.ToList();
使用Array<T>.IndexOf()
静态方法的非LINQ版本:
var indexes = new List<int>();
var lastIndex = 0;
while ((lastIndex = Array.IndexOf(fruits, "apple", lastIndex)) != -1)
{
indexes.Add(lastIndex);
lastIndex++;
}
.ToList()
,你的函数将是惰性的。这意味着如果你运行 indexes.Take(2)
,函数执行时可以一旦找到两个索引就停止,而不是先找到所有的索引,然后再移除除前两个以外的所有索引。 - John Gibb一种方法是这样写:
var indices = fruits
.Select ((f, i) => new {f, i})
.Where (x => x.f == "apple")
.Select (x => x.i);
var indices = new List<int>();
for (int i = 0; i < fruits.Length; i++)
if(fruits[i] == "apple")
indices.Add(i);
使用扩展方法非常简单。
var fruits = new[] { "watermelon","apple","apple","kiwi","pear","banana" };
var indexes = fruits.FindAllIndexes("apple");
public static class Extensions
{
public static int[] FindAllIndexes(this string[] array, string search) => array
.Select((x, i) => (x, i))
.Where(value => value.x == search)
.Select(value => value.i)
.ToArray();
}