11

我有一个按某些条件排序的 IQueryable。现在我想知道特定元素在该 IQueryable 中的位置。是否有一个 linq 表达式来获得它。例如,IQueryable 中有 10 个元素,第 6 个元素匹配一个条件,我想得到数字 6。

4

3 回答 3

16

首先选择每个项目及其索引,然后过滤项目,最后提取原始索引:

var result = orderedList
    .Select((x, i) => new { Item = x, Index = i })
    .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g"))
    .FirstOrDefault();

int index= -1;
if (result != null)
    index = result.Index;

试验台:

class Program
{
    static void Main(string[] args)
    {
        var orderedList = new List<string>
        {
            "foo", "bar", "baz", "qux", "quux",
            "corge", "grault", "garply", "waldo",
            "fred", "plugh", "xyzzy", "thud"
        }.OrderBy(x => x);

        // bar, baz, corge, foo, fred, garply, grault,
        // plugh, quux, qux, thud, waldo, xyzzy
        // Find the index of the first element beginning with 'g'.

        var result = orderedList
            .Select((x, i) => new { Item = x, Index = i })
            .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g"))
            .FirstOrDefault();

        int index= -1;
        if (result != null)
            index = result.Index;

        Console.WriteLine("Index: " + index);
    }
}

输出:

Index: 5
于 2009-12-08T19:47:47.223 回答
2

您可以使用类似的东西query.TakeWhile(x => !matchesCondition(x)).Count(),尽管它具有枚举前面值的效果,这可能不是您想要的。

于 2009-12-08T19:44:04.167 回答
0

您还可以使用包含集合索引作为谓词函数参数的“Where”函数版本。有关详细信息,请参阅MSDN

var result = Enumerable.Range(0, 10).Where((x, i) => i == 6);

如果没有第 6 个元素,该版本可能会导致一个空列表。此外,在您迭代结果之前,这不会评估 where 子句。

于 2009-12-08T22:57:05.770 回答