2011-01-25 5 views
1

このブールの繰り返しをやっている間、私は非既存のオペレータ||=を使用するように誘惑し、その有効な使用を置き換える(というよりも、それだけで「行方不明」だと思う)う単純またはより良い設計が存在しなければならない考え出し:このブーリアン反復で何が問題になっていますか?

bool validExtension = false; 

foreach (string extension in Plugin.Extensions) 
{ 
    validExtension = validExtension || Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase); 

    if (validExtension) 
    { 
     break; 
    } 
} 

importButton.Enabled = File.Exists(importTextBox.Text) && validExtension; 
+0

どのようなタイプのプラグインですか?拡張機能? – naveen

+0

@yetanothercoder:文字列を繰り返すことがわかっている限り、本当に重要ではありません。 – Lazlo

+2

'validExtension'がfalseの場合、高価な' File.Exists'テストを行う際に最後の行のテストを逆にしたいと思うかもしれません。 –

答えて

3

ループには不変があります。本文に入るとvalidExtension = falseです。

だから、体がに簡素化することができますように不変がなかった場合は、常に右側を評価したい、またはif (!lhs) lhs = rhs;場合、あなたは複合代入演算子|=を使用することができ

if (validExtension = Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase)) 
    break; 

あなたが短絡したければ。

+0

==または=?あなたはvalidextension = trueを設定したくないのですか? – naveen

+0

@yetanothercoder: '='、単一の等号。これは代入です。 'validExtension'が設定されています。 –

+0

ええ、そう思います。しかし、もし私がその不変量を持っていなければどうですか? – Lazlo

1

あなたは式の開始時にvalidExtensionが常に偽になるので、validExtension = Path.Get....と言うことはできません。

2
foreach (string extension in Plugin.Extensions) 
{ 
    if (Path.GetExtension(file).Equals(extension.TrimStart('*'), StringComparison.InvariantCultureIgnoreCase)) 
    { 
      validExtension = true; 
      break; 
    } 
} 

あなたが有効な拡張子を見つける最初の時間を壊しているので、これは動作しますので、validExtensionは常にループの最初の行にはfalseです。

0

C#には||=演算子はありませんが、|=演算子があります。 MSDN Reference

+0

しかし、それはいくつかの状況で重要であるかもしれない短絡ではありません(以前の値は常に 'false'なので、短絡は起こりませんのでここにはありません)。 –

0

は、その場合は、文字列[]は、全体のコードは、あなたが常にArray.Contains拡張メソッドを使用することができます配列内の値をチェックするために、この

Func<string[], string, bool> validExtension = (arr, s) => arr.Contains(s); 
importButton.Enabled = validExtension(Plugin.Extensions, Path.GetExtension(file)) && File.Exists(importTextBox.Text); 

のように変更することができます。
P.S:Ben Voigtが合法的に言ったようにテストを逆転しました

関連する問題