3

我正在寻找一个 linq 表达式,它是FindIndex方法的扩展。它只返回第一个索引。我想要列表中满足条件的所有索引。

例如:

var indx = myList.FindIndex(x => (x <= -Math.PI / 3) || (x >= Math.PI / 3));
4

6 回答 6

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);
于 2013-11-11T14:05:19.947 回答
1

尝试这样的事情

IList(int) indx = myList.Select((x, i) => (x <= -Math.PI / 3) || (x >= Math.PI / 3) ? i : -1).Where(i => i != -1).ToList();
于 2013-11-11T14:10:12.420 回答
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);
于 2013-11-11T14:07:32.917 回答
1

Select=> Where=>解决方案是最干净的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));
于 2013-11-11T14:19:08.510 回答
0

这是获得所需结果的另一种方法:

IEnumerable<int> result = Enumerable.Range(0, myList.Count).Where(i => (myList[i] <= -Math.PI / 3) || (myList[i] >= Math.PI / 3));
于 2013-11-11T15:00:54.287 回答
0

我认为它会为你工作:

var indx = myList.Where(x => (x <= -Math.PI / 3) || (x >= Math.PI / 3))
                 .Select((element, index) => index)
                 .ToList();
于 2013-11-11T14:12:21.660 回答