3

私はオフィスで使用している別のソフトウェアのプラグインを作成しており、ユーザーが作業中のファイルを監査できるようにしています。ツールをできるだけ柔軟に保つようにしています。私が考えているのは、ユーザーが他のノードをサブノードとして含むことができるノードのツリーを生成するということです。ツリーの下部にあるノードは、ユーザーが作業しているファイルに応じて失敗または合格する条件ノードになります。さらに、ユーザーは各ノードを AND、OR、NOR、NAND などの特定のロジック タイプに設定できます。 .

AND:  All sub nodes must pass 
OR:   At least one sub node must pass 
NAND: At least one sub node must fail
NOR:  All sub nodes must fail 

私が今理解しようとしているのは、ノードまたはサブノードによって返された bool のコレクションがある場合、上記のロジック タイプをこのリストに適用する最も効率的な方法は何ですか? 勝手に私はステートメントを書き始めましforeachたが、バイナリ ロジックはコンピューターの動作の基本であるため、より優れた、より高速で反復の少ない方法があるようです。

4

1 に答える 1

5

Linq はあなたの友達です:

var booleans = new List<bool> { true, true, false, true };

bool allPass = booleans.All(p => p);
bool anyPass = booleans.Any(p => p);
bool allFail = booleans.All(p => !p);
bool anyFail = booleans.Any(p => !p);

これは実際には aforeachを実行するだけですが、はるかにコンパクトであり、AllandAny操作が必要なものに適合します。

p => pブール値を返すラムダです。たとえば、メソッドを持つノードをチェックしている場合DoesThisPass、チェックを次のように書き直します。

bool allPass = nodes.All(p => p.DoesThisPass());
bool anyPass = nodes.Any(p => p.DoesThisPass());
bool allFail = nodes.All(p => !p.DoesThisPass());
bool anyFail = nodes.Any(p => !p.DoesThisPass());
于 2010-11-06T18:39:56.257 に答える