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 に答える