17

我有一个包含项目 { 10, 11, 23, 34, 56, 43 } 的 int 列表,我想找出所有大于 23 的项目的索引。这些值可以是任何顺序,所以我不想对它们进行排序。

List<int> mylist = new List<int> { 10, 11, 23, 34, 56, 43 };

我对满足条件的所有项目的索引感兴趣,而不仅仅是满足条件的第一个项目。所以这行代码对我不起作用。

int index = mylist.FindIndex( x => x > 23 );
4

4 回答 4

26
var indexes = mylist.Select((v, i) => new { v, i })
                    .Where(x => x.v > 23)
                    .Select(x => x.i);
于 2013-01-23T09:25:16.803 回答
1

Linq 不直接提供这样的东西,但你可以自己编写。像这样的东西:

public static IEnumerable<int> FindIndices<T>(this IEnumerable<T> items, Func<T, bool> predicate) 
{
    int i = 0;

    foreach (var item in items) 
    {
        if (predicate(item)) 
        {
            yield return i;
        }

        i++;
    }
}

然后是这样的:

foreach (int index in mylist.FindIndices( x => x > 23 ))
    ...

(这具有比上面列出的其他方法更有效的优点。但这仅对 LARGE 序列很重要!)

于 2013-01-23T09:26:51.227 回答
0

这个扩展方法完成了这项工作,又好又干净:

public static class ListExtensions
{
    /// <summary>
    /// Finds the indices of all objects matching the given predicate.
    /// </summary>
    /// <typeparam name="T">The type of objects in the list.</typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>Indices of all objects matching the given predicate.</returns>
    public static IEnumerable<int> FindIndices<T>(this IList<T> list, Func<T, bool> predicate)
    {
        return list.Where(predicate).Select(list.IndexOf);
    }
}

查看工作演示

于 2013-01-23T09:27:18.473 回答
0

rgripper 回答的一个小变化,

List<int> mylist = new List<int> { 10, 11, 23, 34, 56, 43 };
List<int> newList = mylist.Select((v, i) => new { v, i })
                        .Where(x => x.v > 23)
                        .Select(x => x.i).ToList<int>();

演示

于 2013-01-23T09:33:15.893 回答