7

しばらく前に、私は非常にひねくれたプロジェクトに取り組んでいました。単一のスコープでしかコードを記述できず、後で (別のモジュールによって) C# 関数に入れられました。

以前に宣言された名前空間のみを使用でき (影響はありませんでした)、自分が作業したスコープの変数しか使用できませんでした。そのため、ヘッダーとインクルード ライブラリを変更できませんでした。

問題は、ジェネリック コレクションを操作したいときに発生しました。ラムダ式も LINQ も使用できませんでしusing System.Linq;た。ファイル ヘッダーにアクセスできなかったため、単純に を配置できませんでした。

簡単なことをするだけで済み、LINQ やラムダを使わなくても簡単に管理できました。ただし、その後、IEnumerable でさらに複雑な操作を使用する必要がある場合はどうなるのだろうと考えていました。それから、私の質問があります:

ファイル ヘッダーを変更したり、新しい名前空間を追加したりせずに、LINQ またはラムダを使用することは可能ですか?

があるとしましょう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?

この問題はかなり風変わりなものであることは承知しており、このような方法を取るのは非常に珍しいことですが、ただ興味があるだけで、このケースに関する情報は見つかりませんでした。

4

3 に答える 3

17

ディレクティブがないと、 、 using、 などのメソッドは解決されません。つまり、言語部分のLINQ は機能しません。長い手で(そして逆に)コーディングする必要があります:.Where.Select

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

これは、グループ、順序、「let」、結合などを含む長い例ではますます複雑になることに注意してください。かなり単純なことをしている場合を除き、usingディレクティブを追加する方法を見つけることをお勧めします。

ただし、_Numbersが a の場合は、次のList<T>ように使用できることに注意してください (この 1 つの例の場合):

List<int> _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0);
于 2013-07-15T09:20:24.437 に答える
2

ファイル「ヘッダー」にアクセスできない理由はあまり明確ではありませんが、ファイルのusing先頭に直接入力できないという問題がある場合でも、次のようなタイプの完全修飾名を使用できます。

System.Linq.Enumerable(...)

これを機能させるには、当然、正しい参照も含める必要があります。

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

于 2013-07-15T09:17:49.457 に答える