9

たとえば、次のリストがあります

List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);

20である最初の要素のインデックスを取得する必要がある場合は、

FindIndex()

しかし、複数の結果に使用できる方法はありますか?番号10の要素のインデックスが必要だとします。

FindAll()メソッドがあることは知っていますが、これにより、インデックスが挿入された新しいリストが得られます。

最良の(?)メソッドは、インデックスの配列を取得することです。

4

3 に答える 3

14

次のコードの最大の欠点は、マジックナンバーとして-1を使用することですが、インデックスの場合は無害です。

var indexes = lst.Select((element, index) => element == 10 ? index : -1).
    Where(i => i >= 0).
    ToArray();
于 2013-01-05T17:34:51.743 に答える
5

考えられる解決策の1つは次のとおりです。

var indexes = lst.Select((item, index) => new { Item = item, Index = index })
                 .Where(v => v.Item == 10)
                 .Select(v => v.Index)
                 .ToArray();

最初にすべてのアイテムとそのインデックスを選択し、次にアイテムをフィルタリングして、最後にインデックスを選択します

更新:私のソリューションまたはイブのソリューションのいずれかをカプセル化する場合は、次のようなものを使用できます

public static class ListExtener
{
    public static List<int> FindAllIndexes<T>(this List<T> source, T value)
    {
        return source.Select((item, index) => new { Item = item, Index = index })
                        .Where(v => v.Item.Equals(value))
                        .Select(v => v.Index)
                        .ToList();
    }
}

そして、次のようなものを使用します。

List<int> lst = new List<int>();
lst.Add(20);
lst.Add(10);
lst.Add(30);
lst.Add(10);
lst.Add(90);


lst.FindAllIndexes(10)
    .ForEach(i => Console.WriteLine(i));
Console.ReadLine();
于 2013-01-05T17:39:02.967 に答える
2

さらに別の解決策を与えるために:

Enumerable.Range(0, lst.Count).Where(i => lst[i] == 10)

そしてもちろん、それは拡張メソッドにすることができます:

public static IEnumerable<int> FindAllIndices<T>(this IList<T> source, T value)
{
  return Enumerable.Range(0, source.Count)
    .Where(i => EqualityComparer<T>.Default.Equals(source[i], value));
}
于 2013-01-05T18:18:12.363 に答える