メソッド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. InputStreamのread()メソッドはどのように実装されていますか?
- 2. AnyRefの同期メソッドはどのように実装されていますか?
- 3. どのようにしてonCreateOptionsMenuメソッドをSherlockFragmentに実装しますか?
- 4. Redux Thunkはどのように実装していますか
- 5. LINQ SingleOrDefault in Typescript
- 6. jq like on()メソッドを実装しようとしています
- 7. @privateはどのように実装されていますか?
- 8. BigDecimalはどのように実装されていますか?
- 9. HttpSessionはどのように実装されていますか?
- 10. removeEventListenerはどのように実装されていますか?
- 11. INativeElementViewはどのように実装されていますか?
- 12. PTRACE_SINGLESTEPはどのように実装されていますか?
- 13. テンソルフローはどのように実装されていますか?
- 14. \ bはどのように実装されていますか?
- 15. フィルタはどのように実装されていますか?
- 16. MarshalByRefObjectはどのように実装されていますか?
- 17. クロスバリデーションはどのように実装されていますか?
- 18. タスクスケジューリングはどのように実装されていますか?
- 19. os.path.fileはどのように実装されていますか?
- 20. getchar()はどのように実装されていますか?
- 21. モバイルバックグラウンドループはどのように実装されていますか?
- 22. 抽象メソッドが実装されているかどうかはどのように判断できますか?
- 23. どのようにonShowCustomViewメソッドを実装するのですか?
- 24. GOLD Parse、実際にコードをどのように実装していますか?
- 25. clangは弱いptrをどのように実装していますか?
- 26. メソッドが表示されていない場合、WCFプロキシはどのようにICommunicationObjectを実装しますか?
- 27. javaにLINQのような実装がありますか?
- 28. Qtはどのようにグラフの実装をサポートしていますか?
- 29. どのように私は、デリゲートの工場を実装していますか?
- 30. GolangはどのようにゴルーチンのOSスレッドを実装していますか?