2009-05-27 11 views

答えて

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より大きい場合は例外をスローします。

関連する問題