3

フィルタ値に従ってソートされたオブジェクトのコレクションをフィルタリングするコードがいくつかあります。たとえば、。のオブジェクトを見つけたいと思いますName=="searchquery"。次に、そのコレクションから上位Xの値を取得します。

私の質問:

  • 私のコレクションはList<T>です。このコレクションはソート順を保証しますか?

  • もしそうなら、条件を満たす上位X個のオブジェクトを見つけるための組み込みの方法はありますか?私はのようなものを探しています

    collection.FindAll(o=>o.Name=="searchquery",100);
    

    これで、条件を満たす上位100個のオブジェクトが得られます。その理由はパフォーマンスです。100個のオブジェクトを見つけたら、コレクション全体をチェックし続けたくありません。

  • 私が書いた場合:

    collection.FindAll(o=>o.Name=="searchquery").Take(100);
    

    ランタイムは、100に達するとチェックを停止するのに十分インテリジェントですか?

もちろんこれを自分で実装することもできますが、組み込みの方法(LInQメソッドなど)がある場合は、それを使用したいと思います。

4

4 に答える 4

4
collection.Where(o=>o.Name=="searchquery").Take(100)

順序は元のリストと同じ順序である必要があり、100個の要素を取得するとチェックを停止します(Where要素を取得したときにのみ評価される列挙を返します)。ドキュメントから:

このメソッドは、遅延実行を使用して実装されます。即時戻り値は、アクションの実行に必要なすべての情報を格納するオブジェクトです。このメソッドで表されるクエリは、GetEnumeratorメソッドを直接呼び出すか、Visual C#のforeachまたはVisualBasicのForEachを使用して、オブジェクトが列挙されるまで実行されません。

別の並べ替え順序が必要な場合は、それを指定する必要があります(もちろん、これは、すべての要素を調べる以外に選択肢がないことを意味します)。

于 2012-10-04T08:24:43.537 に答える
1

Ok、

私のコレクションはList<T>です。このコレクションはソート順を保証しますか?

いいえ。ただし、挿入の順序は保持されます。

もしそうなら、条件を満たす上位X個のオブジェクトを見つけるための組み込みの方法はありますか?

     someEnumerable.Where(r => r.Name == "searchquery").Take(100)

私が書いた場合:

    // Some linq that works

ランタイムは、100に達するとチェックを停止するのに十分インテリジェントですか?

はい、たぶん


ここで、IList並べ替えられたを持っていて、上位100個のアイテムをすばやく反復したい場合は、これを実行します。

var list = sourceEnumerable.OrderBy(r => r.Name).ToList();
foreach(var r in list.Where(r => r.Name == "searchquery").Take(100))
{
    // Do something
}
于 2012-10-04T08:39:36.037 に答える
1
 collection.Where(o=>o.Name=="searchquery").Take(100)

舞台裏でWhere実行の延期があるため、最も正しい答えは次のとおりですWhere。メソッドの実装方法は次のとおりです。

Where(this IEnumerable<T>, Func<T, bool> func)
{
    foreach (var item in collection)
    {
        if (func(item))
        {
            yield return item;
        }
    }
}

したがって、を呼び出すTake(100)と、ループは基準を満たす最初の100個のアイテムを見つけるだけです。

于 2012-10-04T09:09:47.837 に答える
1

コレクション内のオブジェクトが繰り返されていないことが確実にわかっている場合(たとえば、主キーなど)、の代わりにSortedListを使用できますList<T>。これにより、特定の基準を使用してリストをフィルタリングしたときにリストがソートされることが保証されます。ソートされたリストの例については、こちらをご覧ください。

http://msdn.microsoft.com/en-us/library/system.collections.sortedlist(v=vs.100).aspx

于 2012-10-04T10:55:54.140 に答える