メソッドSingleOrDefault()はLINQでどのように評価されますか?舞台裏でバイナリサーチを使用していますか?LINQはどのようにSingleOrDefault()メソッドを実装していますか?
2
A
答えて
12
言葉で説明しようとするよりも、Reflectorプログラムを使用して取得された.NET Frameworkで正確な実装コードを投稿するだけで、わずかに再フォーマットされていると思いました。
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
throw Error.ArgumentNull("source");
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
switch (list.Count)
{
case 0:
return default(TSource);
case 1:
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (!enumerator.MoveNext())
return default(TSource);
TSource current = enumerator.Current;
if (!enumerator.MoveNext())
return current;
}
}
throw Error.MoreThanOneElement();
}
これは、オブジェクトが非常に賢明なようだタイプIList<T>
、のであれば、最適化が行われていることoberserveするのは非常に興味深いです。そうでなければ、オブジェクトがIEnumerable<T>
より具体的なものを実装していない場合は、単にオブジェクトを列挙することに戻ります。
オブジェクトが必ずソートされたコレクションを表すとは限らないため、バイナリ検索は使用できません。 (実際、ほとんどの使用例ではそうではありません)
0
私はそれがすべての検索を行うとは思わない、それはすべてのソース[リスト、結果セットなど]の最初の要素を取得することです。
私の最高の推測では、最初の要素を引っ張るだけです。最初のものがない場合は、デフォルト(null、0、falseなど)が返されます。最初のものがある場合は、2番目の結果を取得しようとします。 2番目の結果がある場合、例外がスローされます。それ以外の場合は、最初の結果を返します。
2
私は単純にクエリを実行し、結果カウントがゼロの場合、クラスのデフォルトインスタンスを返します。結果カウントが1の場合、そのインスタンスを返し、結果カウントが1より大きい場合は例外をスローします。
関連する問題
- 1. AnyRefの同期メソッドはどのように実装されていますか?
- 2. どのようにしてonCreateOptionsMenuメソッドをSherlockFragmentに実装しますか?
- 3. LINQ SingleOrDefault in Typescript
- 4. @privateはどのように実装されていますか?
- 5. BigDecimalはどのように実装されていますか?
- 6. MarshalByRefObjectはどのように実装されていますか?
- 7. \ bはどのように実装されていますか?
- 8. getchar()はどのように実装されていますか?
- 9. フィルタはどのように実装されていますか?
- 10. タスクスケジューリングはどのように実装されていますか?
- 11. HttpSessionはどのように実装されていますか?
- 12. 抽象メソッドが実装されているかどうかはどのように判断できますか?
- 13. どのようにonShowCustomViewメソッドを実装するのですか?
- 14. GOLD Parse、実際にコードをどのように実装していますか?
- 15. メソッドが表示されていない場合、WCFプロキシはどのようにICommunicationObjectを実装しますか?
- 16. どのように私は、デリゲートの工場を実装していますか?
- 17. Qtはどのようにグラフの実装をサポートしていますか?
- 18. AbstractTableModelをJTableに実装しています。どのようにメソッドを追加するには?
- 19. インターフェイスはどのように機能を実装していますか?
- 20. JVMはIdentityHashMapをどのように実装していますか?
- 21. scribdはズーミングをどのように実装していますか?
- 22. cushy cmsはどのように機能を実装していますか?
- 23. レールはどのようにbefore_filterを実装していますか?
- 24. economist.comは固定ヘッダをどのように実装していますか? jQuery?
- 25. golangはリフレクションをどのように実装していますか?
- 26. MapReduceフレームワークはどのようにソート段階を実装していますか?
- 27. emacsはどのようにgrepを実装していますか?
- 28. MongoDBは空間インデックスをどのように実装していますか?
- 29. Chromeはどのようにタブを実装していますか?
- 30. phpmyadminはどのように "検索"機能を実装していますか?