9

比方说,我们有一个列表

List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);

如果我需要获取第一个元素的索引 20 我会使用

FindIndex()

但是有没有一种方法可以用于多个结果?假设我想要编号为 10 的元素的索引。

我知道有一个方法 FindAll() 但这给了我一个插入索引的新列表。

最好的(?)方法是获取索引数组。

4

3 回答 3

14

以下代码的最大缺点是它使用 -1 作为幻数,但在索引的情况下它是无害的。

var indexes = lst.Select((element, index) => element == 10 ? index : -1).
    Where(i => i >= 0).
    ToArray();
于 2013-01-05T17:34:51.743 回答
5

一种可能的解决方案是:

var indexes = lst.Select((item, index) => new { Item = item, Index = index })
                 .Where(v => v.Item == 10)
                 .Select(v => v.Index)
                 .ToArray();

首先选择所有项目及其索引,然后过滤项目,最后选择索引

更新:如果你想封装我或 Eve 的解决方案,你可以使用类似的东西

public static class ListExtener
{
    public static List<int> FindAllIndexes<T>(this List<T> source, T value)
    {
        return source.Select((item, index) => new { Item = item, Index = index })
                        .Where(v => v.Item.Equals(value))
                        .Select(v => v.Index)
                        .ToList();
    }
}

然后你会使用类似的东西:

List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);


lst.FindAllIndexes(10)
    .ForEach(i => Console.WriteLine(i));
Console.ReadLine();
于 2013-01-05T17:39:02.967 回答
2

只是提供另一个解决方案:

Enumerable.Range(0, lst.Count).Where(i => lst[i] == 10)

当然也可以做成扩展方法:

public static IEnumerable<int> FindAllIndices<T>(this IList<T> source, T value)
{
  return Enumerable.Range(0, source.Count)
    .Where(i => EqualityComparer<T>.Default.Equals(source[i], value));
}
于 2013-01-05T18:18:12.363 回答