2013-07-15 5 views
6

いくつかの時間前に、私は非常にねじれたプロジェクトに取り組んできました。コードを単一スコープで書くことしかできず、後で(別のモジュールによって)C#関数に入れられます。System.Linq名前空間を含めずにLinqとlambdaを使用することはできますか?

私は以前に宣言された(私はそれらに影響を与えなかった)ネームスペースしか使用できませんでした。 そのため、私はヘッダーとライブラリを変更できませんでした。私はどちらもラムダ式を使用することができませんでした、またLINQ - -

問題は、私はジェネリックコレクションを操作したいときに来た私は、ファイルヘッダへのアクセス何もなかったように私は単純に、using System.Linq;を置くことができません ました。

私は単純なことをしなければならず、LINQまたはラムダなしでは管理が簡単でした。しかし、その後、IEnumerableでより複雑な操作を する必要がある場合、何が起こるのか不思議に思っていました。 それから、私の質問が来る:

ファイルヘッダーを変更したり、新しい名前空間を追加することなく、LINQまたはlambdaを使用することはできますか?

List<int> _Numbers = new List<int>();があるとします。いくつかの数字でいっぱいにしましょう。 ここからすべての偶数を選択したいと思います。ヘッダー内のusing System.Linq;

、解決策は明白です:

List<int> _NewList = _Numbers.Where(n => n % 2 == 0).ToList(); 

または

List<int> _NewList = (from _Number in _Numbers where _Number % 2 == 0 select _Number).ToList(); 

しかし、どのように私はこれを達成することができ、LINQは含まなくて?私は、問題はむしろエキゾチックであることを認識しています、そしてそれはこの道を行くことは非常に珍しいのですが、私はちょうど好奇心だと私はこのことについて何の情報も見つからなかっまし

List<int> _NewList = System.Linq. // ??? What to add here? 

: 私の最初の推測では、のようなものになるだろう場合。

+1

'System.Linq.Enumerable.Where(_NewList、n => n%2 == 0)' –

+0

@nsinreal - これはまさに私が探していたものです。それを答えとして追加し、それを正しいとマークします; –

+0

クラスの名前空間宣言内に 'using'ステートメントを含めることもできます。それはあなたがアクセスできる範囲外ですか? – Sam

答えて

15

usingディレクティブがない場合、.Where,.Selectのようなメソッドは解決されません。つまり、LINQ の言語部分は機能しません。あなたはそれを長い手をコーディングする必要があります(後方と!):これは、基との長い例の増大する複雑になること

List<int> _NewList = System.Linq.Enumerable.ToList(
    System.Linq.Enumerable.Where(_Numbers, _Number => _Number % 2 == 0) 
); 

注意、注文を、sの「聞かせて」、あなたはかなり何かをやっている場合を除きなどに参加します単純であれば、usingディレクティブを追加する方法を見つけることをお勧めします。

ただし、_NumbersList<T>であれば、あなただけ(この単一など)を使用できること:気をつけて、

System.Linq.Enumerable.Where(_NewList, n => n % 2 == 0) 

しかし:

List<int> _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0); 
+0

ありがとう、それは多く説明した。私はFindAll()について知っていますが、私が知っている限り、それはリストでのみ動作し、より普遍的な方法を探していました。 –

2

ない非常に明確なファイル「ヘッダ」にアクセスすることができない理由が、あなたは、ファイルusing dirrectiveの初めには入力できない問題、あなたはまだのように、タイプの完全修飾名を使用できるかどうか:

System.Linq.Enumerable(...) 

この作業を行うには、当然、正しい参照も含める必要があります。

これはあなたが求めているものでない場合は、明確にしてください。

+1

ファイルヘッダにアクセスできませんでした。これは私が作業していたAPiの問題でした。私はSystem.Linqを追加できることを知っています。私はそれをもっと評価する方法を知らなかった。 –

3

は、あなたがこのようなコードを書くことができます:あなたのクラスがインターフェイスIQueryable<T>を実装している場合、上のコードは仕事をしますが、もっと遅くなります。

System.Linq.Queryable.Where(_NewList, n => n % 2 == 0) 

IQueryableは、SQLのように、他のDSL言語でのC#を生成するための方法ですので。他のwhere条件では、SQLサーバーはできるだけ早く必要な要素を選択できます。しかし、IEnumerableまたはSystem.Linq.Enumerableで作業する場合、サーバ側で最適化する必要はありません。アイテムの完全なリストが得られます。それらはすべてメモリにロードされ、メモリにフィルタリングされます。

関連する問題