2009-03-09 1 views
0

私はプライベートリストを持っています。リストを照会し、新しいクローンアイテムで新しいリストを返す機能が公開されています。フィルタリングと並べ替えの代理人を渡すことはできますが、これはうまくいきますが、Linq式を使用できるようになるとはるかにエレガントになります。プライベートリストで使用するLINQ式を公開/渡す

私は何をしようとしているのかの簡単な例を追加しました。これは、私がうまくやりたいことを説明したとは思えません。

public class Repository 
{ 
    private List<SomeModel> _models; 
    private object _lock; 

    public List<SomeModel> GetModels(Func<SomeModel, bool> predicate) 
    { 
     List<SomeModel> models; 
     lock (_lock) 
     { 
      models = _models.Where(m => predicate(m)) 
          .Select(m => new SomeModel(m)) 
          .ToList(); 
     } 
     return models; 
    } 
} 
+0

実際には、フィルタリング、順序付けとページングを行い、「expression.Compile()。Invoke(..)」のような何かをLinq式で渡すことを望んでいました。質問#53597は私がやりたいことと似ています。 – tarn

答えて

1

あなたはこのような何かを行うことによってイテレータブロックとしてプライベートコレクションを公開することができます:

public IEnumerable<Model> Models 
{ 
    get 
    { 
     foreach (Model mod in this._models) 
      yield return new Model(mod); 

     // equivalent to: 
     // return _models.Select(m => new Model(m)); 
     // as per Jon's comment 
    } 
} 

どの他のIEnumerableデータソースのようにクエリを書くことができます。

+1

別名return _models.Select(m => new Model(m)); –

+0

素敵な答えですが、私は内部のロックから収穫するのは良くないと感じています。私はそれを見て、それが安全に働くならば、これを幸せに答えとしてマークします。 – tarn

+0

あなたは 'return _models;'を実行できませんでしたか?私が見る限り、戻り値のタイプIEnumerable と、リストが列挙可能であるという事実のために、単に 'return _models;'を実行すると、それを列挙型として公開するでしょう...(または私が何かを見逃しましたか?) – Svish

3

なぜコードにロックが必要ですか?あなたの例が示すように、あなたの「SomeModel」クラスはコピーコンストラクタを持っている、これは動作するはずと仮定:

public List<SomeModel> GetModels(Predicate<SomeModel> predicate) 
{ 
    return _models.Where(m => predicate(m)) 
        .Select(m => new SomeModel(m)) 
        .ToList(); 
} 
+0

ありがとうございます、リストが別のプロセスによって更新されているのでロックされています(表示されていませんが、リストを公開するだけの理由がありません)。はい、表示されているSomeModel ctorはコピーコンストラクタです。私も注文とページングを適用したいので、私は述語以上のものを望みます。私はLinq式を適用したい。 – tarn

+0

あなたが注文などをしたい場合(以下の答えに従って)、あなたはリストを返さず、単にSelect句を返す方が良いでしょう。呼び出し元は、返されたIQueryable/IEnumerableにソート/ページングロジックを適用できます。 –

+0

良いコール、それは意味がある、うまく動作し、私はおそらく実際にそれを行うでしょう。しかし、私はこれを(1時間程度)答えたままにしておくつもりです。誰かがロックの外で式を作成してロックの中で実行する方法を持っていることを願っています。 – tarn

関連する問題