在数组中查找多个索引

9

假设我有这样一个数组

  string [] fruits = {"watermelon","apple","apple","kiwi","pear","banana"};

是否有内置函数可以查询所有“apple”的索引? 例如:

  fruits.FindAllIndex("apple"); 

将返回一个包含1和2的数组。

如果没有,我应该如何实现它?

谢谢!


请看这里:http://msdn.microsoft.com/zh-cn/library/7eddebat(v=vs.110).aspx - webdad3
3个回答

12

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++;
}

@PaulNikonowicz 对不起,我在Linq方面非常新手,你能解释一下“lazy”是什么意思吗?谢谢! - Fever
1
如果你在第一个方法中删除 .ToList(),你的函数将是惰性的。这意味着如果你运行 indexes.Take(2),函数执行时可以一旦找到两个索引就停止,而不是先找到所有的索引,然后再移除除前两个以外的所有索引。 - John Gibb
1
ToList并不会先找到所有的索引,它仍然会在找到前两个项目时停止... ToList只是让查询立即运行,而不是被延迟。 - Fabio Marcolini
@FabioMarcolini 如何实现不区分大小写? - DevelopmentIsMyPassion

8

一种方法是这样写:

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);

1
@PaulNikonowicz 那有什么不好的呢? - D Stanley
1
我认为他并没有说那是不好的,只是提供了额外的信息。 - John Gibb
@Magnus,它运行得很好!谢谢!但我不明白第一个SELECT是如何知道'f'是对象的内容,而'i'是索引?谢谢! - Fever
@Fever 此处使用了此选择函数,其中选择器具有对象和索引。 - Magnus

0

使用扩展方法非常简单。

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接