252

ループせずにリスト内のアイテムのインデックスを見つけるにはどうすればよいですか?

現在、これはあまり見栄えがよくありません-インデックスを取得するためだけに、同じアイテムのリストを2回検索します:

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
4

8 に答える 8

83

編集: aのみを使用していて、インデックスのみList<>が必要な場合は、実際に最良のアプローチです。別のものが必要な人のために、この回答をここに残しておきます(たとえば、 any の上に)。List.FindIndexIEnumerable<>

述語でインデックスを取るのオーバーロードを使用してSelect、リストを (インデックス、値) ペアに変換します。

var pair = myList.Select((Value, Index) => new { Value, Index })
                 .Single(p => p.Value.Prop == oProp);

それで:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);

または、インデックスのみが必要で、これを複数の場所で使用している場合は、 のような独自の拡張メソッドを簡単に作成できますがWhere、元のアイテムを返す代わりに、述語に一致するアイテムのインデックスを返します。

于 2013-08-01T13:42:28.517 に答える
15

LINQ を使用しない場合は、次のようにします。

int index;
for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Prop == oProp)
    {
       index = i;
       break;
    }
}

このようにして、リストを 1 回だけ繰り返します。

于 2013-08-01T13:42:48.800 に答える