我正在寻找一个linq表达式,它是FindIndex方法的扩展。它只返回第一个索引。我希望列表中的所有索引满足条件。
例如:
var indx = myList.FindIndex(x => (x <= -Math.PI / 3) || (x >= Math.PI / 3));
答案 0 :(得分:9)
然后你需要使用LINQ,因为List.FindIndex
只返回第一个。您可以使用Enumerable.Select
的重载来提供序列中项目的索引来创建匿名类型。
IEnumerable<int> allIndices = myList
.Select((item, index) => new { item, index })
.Where(x => (x.item <= -Math.PI / 3) || (x.item >= Math.PI / 3))
.Select(x => x.index);
答案 1 :(得分:1)
我首先将您的列表投射到一组元组中:
var indices = myList.Select((x, i) => new { Value = x, Index = i })
.Where(o => (o.Value <= -Math.PI / 3) || (o.Value >= Math.PI / 3))
.Select(o => o.Index);
答案 2 :(得分:1)
尝试这样的事情
IList(int) indx = myList.Select((x, i) => (x <= -Math.PI / 3) || (x >= Math.PI / 3) ? i : -1).Where(i => i != -1).ToList();
答案 3 :(得分:1)
Select
=&gt; Where
=&gt; Select
解决方案是最干净的方法。
如果你想要更有创意和更紧凑的东西:
bool Condition(double item)
{
return (item <= -Math.PI / 3) || (item >= Math.PI / 3);
}
var indices = myList.SelectMany((x, i) =>
Enumerable.Repeat(i, Condition(x) ? 1 : 0)).ToList();
内部Enumerable.Repeat
将在满足Condition
时生成索引,否则将不返回任何内容。 SelectMany
将展开集合集合以生成索引。
这可以概括为:
public static class EnumerableExtensions
{
public static IEnumerable<int> FindIndices<T>(
this IEnumerable<T> collection,
Func<T, bool> predicate)
{
return collection.SelectMany((x, i) =>
Enumerable.Repeat(i, predicate(x) ? 1 : 0));
}
}
var indices = myList.FindIndices(item =>
(item <= -Math.PI / 3) || (item >= Math.PI / 3));
答案 4 :(得分:0)
我认为它适合你:
var indx = myList.Where(x => (x <= -Math.PI / 3) || (x >= Math.PI / 3))
.Select((element, index) => index)
.ToList();
答案 5 :(得分:0)
这是获得所需结果的另一种方式:
IEnumerable<int> result = Enumerable.Range(0, myList.Count).Where(i => (myList[i] <= -Math.PI / 3) || (myList[i] >= Math.PI / 3));