我有一个包含项目 { 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 );
var indexes = mylist.Select((v, i) => new { v, i })
.Where(x => x.v > 23)
.Select(x => x.i);
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 序列很重要!)
这个扩展方法完成了这项工作,又好又干净:
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);
}
}
查看工作演示