web-dev-qa-db-ja.com

単一の手順でリスト内のアイテムのインデックスを取得する方法

ループしないでリスト内の項目のインデックスを見つける方法はありますか。

現在のところ、これはあまり見栄えがよくありません。同じアイテムを2回検索して、インデックスを取得するだけです。

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
157
Daniel Robinson

List.FindIndexメソッドはどうですか

int index = myList.FindIndex(a => a.Prop == oProp);

このメソッドは線形検索を実行します。したがって、このメソッドはO(n)操作です。ここで、nはCountです。

361
Alex Filipovici

単純型の場合は、 "IndexOf"を使用できます。

List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.

編集:あなたがList<>を使っていて only を使っていて、かつ only がインデックスを必要としているなら、List.FindIndexが本当に最善の方法です。何か違うことが必要な人(例えばIEnumerable<>の上など)にはこの答えを残します。

述語の中でインデックスをとるSelectのオーバーロードを使うので、リストを(index、value)のペアに変換します。

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);

あるいは、 only がインデックスを欲しがっていて、これを複数の場所で使っているのであれば、Whereのような独自の拡張メソッドを簡単に書くことができます。述語に一致した項目.

65
Jon Skeet

LINQを使いたくないのなら、

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

このようにあなたは一度だけリストを繰り返しています。

12
gzaxx
  1. リスト内の任意の文字列値のインデックスを見つけるための簡単な解決策。

これがList Of Stringのコードです。

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
  1. リスト内の任意の整数値のインデックスを見つけるための簡単な解決策。

これは整数のリストのためのコードです:

    int indexOfNumber = myList.IndexOf(/*insert number from list*/);
3
user5245248

リスト内の任意の文字列値のインデックスを見つけるための簡単な解決策。これがList Of Stringのコードです。

int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list"));

リスト内の任意の整数値のインデックスを見つけるための簡単な解決策。これは整数のリストのためのコードです:

int indexOfNumber = myList.IndexOf(//insert number from list);
1
Bob

これがIEnumerableのコピー/貼り付け可能な拡張メソッドです

public static class EnumerableExtensions
{
    /// <summary>
    /// Searches for an element that matches the conditions defined by the specified predicate,
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
    /// </returns>
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
    {
        var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
        return idx;
    }
}

楽しい。

0
Snæbjørn