C# 在数组中查找多个索引

C# 在数组中查找多个索引,c#,.net,arrays,linq,C#,.net,Arrays,Linq,假设我有一个这样的数组 string [] fruits = {"watermelon","apple","apple","kiwi","pear","banana"}; 是否有一个内置函数允许我查询“apple”的所有索引? 比如说, fruits.FindAllIndex("apple"); 将返回1和2的数组 如果没有,我应该如何实施 谢谢 一种方法是这样写: var indices = fruits .Select ((f, i) =>

假设我有一个这样的数组

  string [] fruits = {"watermelon","apple","apple","kiwi","pear","banana"};
是否有一个内置函数允许我查询“apple”的所有索引? 比如说,

  fruits.FindAllIndex("apple"); 
将返回1和2的数组

如果没有,我应该如何实施


谢谢

一种方法是这样写:

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索引=新列表();
for(int i=0;i
LINQ版本:

var indexes = fruits.Select((value, index) => new { value, index })
                    .Where(x => x.value == "apple")
                    .Select(x => x.index)
                    .ToList();
非LINQ版本,使用
Array.IndexOf()
static方法:

var indexes = new List<int>();
var lastIndex = 0;

while ((lastIndex = Array.IndexOf(fruits, "apple", lastIndex)) != -1)
{
    indexes.Add(lastIndex);
    lastIndex++;
}
var索引=新列表();
var lastIndex=0;
而((lastIndex=Array.IndexOf(水果,“苹果”,lastIndex))!=-1)
{
添加(lastIndex);
lastIndex++;
}

看看这里:@PaulNikonowicz对不起,我是Linq的新手,你能解释一下你说的懒惰是什么意思吗?谢谢如果在第一个方法中删除
.ToList()
,则函数将是惰性的。这意味着,如果运行
索引。取(2)
,一旦找到两个索引,该函数就可以停止执行,而不是先找到所有索引,然后删除除前两个之外的所有索引。ToList不能使它先找到所有索引,当找到前两个项时,它仍然会停止执行。。。ToList只需立即运行查询,而不是deferred@PaulNikonowicz这很糟糕-为什么?我不认为他说这很糟糕,只是提供了额外的信息。@Magnus它工作得很好!谢谢但我不明白第一个SELECT如何知道“f”是对象的内容,“I”是索引?谢谢@在选择器同时具有对象和索引的情况下使用。