2010-12-31 18 views
1

述語条件に基づいてフィルタリングするIEnumerableのFindAllメソッドを作成しました。配列とリストの両方に共通です。なぜならSIL拡張メソッドがSilverlightウィンドウで動作しない電話番号

でコード:それは私のアプリケーションで私のために働いていない理由

public static IEnumerable<T> FindAll<T>(this IEnumerable<T> tCollection, Func<T, bool> predicate) 
{ 
    if (null == tCollection) yield return default(T); 
    using (IEnumerator<T> iterator = tCollection.GetEnumerator()) 
    { 
      if (!iterator.MoveNext()) 
      { 
       yield return default(T); 
       yield break; 
      } 

      do 
      { 
       if (predicate(iterator.Current)) 
       yield return iterator.Current; 
      } 
      while (iterator.MoveNext()); 
    } 
} 

私が呼び出していたときに、それは私のために動作しません。..

List<string> strings = new List<string> { "Kumaran", "Raj", "Kannan", "Karthi", "Gopal" }; 

    IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K")); 

は、私が知ることができます。

+3

こんにちは「それは私にとってはうまくいかない」という言い回しについて詳しく述べていますか? –

+0

リストが空であるか参照がnullの場合、なぜ単一の要素(デフォルト)を生成したいのですが、リストにエントリがあり、いずれも述語と一致しない場合、なぜですか?なぜ、あなたは単に組み込みの 'Enumerable.Where'メソッドを使用していませんか? –

+0

Silverlightで異なる動作が見られる理由は、 'List 'には既に 'FindAll'メソッドがあるので(これは壊れていないので)、メソッドがデスクトップ.N​​ET上で全く呼び出されないということです。 。 –

答えて

3

私の推測ですが(実際の関連コードをすべて表示していない可能性もありますが)

FindAllメソッドのどこかにブレークポイントを配置します。次に、次の行を実行します。 -

IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K")); 

ただし、ブレークポイントはヒットしません。

ただしこれは正しいです。列挙子のMoveNextへの最初の呼び出しがIEnumerableから取得され、strになるまで、FindAllメソッドは実際には呼び出されません。だから、コードforeachstrにしてコードを実行すると、コードが実行されるはずです。

あなたの実装は少し疑わしいですが、ソースがnullまたは空のときに単一のデフォルト値を含む列挙型を返すことは望ましくありませんか?

実際にIEnumerable<T>からフィルタリングされたセットを返す場合は、代わりにLinq Where拡張メソッドを使用してください。一方、リスト用の完全な.NET APIにあるFindAllの実装を作成しようとしている場合は、List<T>も返す必要があります。

私は、あなたが本当にやるべきことは、あなたのコードファイルにこのusingを追加していると思われる: -

using System.Linq; 

、あなたが使用することができます: -

IEnumerable<string> str = strings.Where(item => item.StartsWith("K")); 

とあなたが本当にFindAllが必要な場合次にList<T>を返します。 -

List<string> str = strings.Where(item => item.StartsWith("K")).ToList(); 
関連する問題