2012-02-29 6 views
0

文字列のリストをループし、それらを1つの文字列に対してチェックしようとしています。一致するものが見つからない場合は、コードを終了する必要があります。設定で1つだけの文字列があるかどうリストをループし、一致するものがない場合にのみ "返す"

// loadedObj.Settings contains the list of strings, can be any number of strings  
foreach (var currentCheckBox in loadedObj.Settings.Where(currentCheckBox => currentCheckBox != null)) 
    { 
     // docTypeAlias is a single string that needs to be matched 
     var docTypeAlias = sender.ContentType.Alias; 
     // This is the current value of currentCheckBox 
     var requiredTypeAlias = currentCheckBox; 
     if (!requiredTypeAlias.Equals(docTypeAlias)) return; 
    } 

コードが正常に動作しますが、最初のものは、明らかに一致しない場合は、すぐにあなたが複数の文字列を持っているように、コードがあまりにも早く終了します。

+0

「currentCheckBox」はCheckBoxのようです。 CheckBoxはどのように文字列のリストになりますか?あなたのコードは、あなたのテキストに関係しているようなものも何もしようとしません。タイプを明確にするために編集でき、実際の目標は何ですか? –

+0

通常の「foreach」ループを使用しないのはなぜですか? – udidu

+0

申し訳ありませんが、これは他のコードからコピーされた名前です。実際にはxmlファイルから読み込まれたcheckBoxアイテムのリストです。 –

答えて

1

Anyを使用すると、シーケンス内の要素が条件に一致するかどうかを確認できます。存在しない場合、結果はfalseになります。

var docTypeAlias = sender.ContentType.Alias; 
bool hasMatch = loadedObj.Settings.Any(current => docTypeAlias.Equals(current)); 
if (hasMatch) 
{ 
    // can work 
} 
else 
{ 
    // can't work 
} 
+0

それは治療アンソニー、非常にありがとうございます。 –

+0

+1精神的な答えです。 :) –

0

あなたの代わりに、関数から返す「リターン」の(foreachの中で、コードの残りの部分をスキップし、次の項目をチェックするために)「継続」したいように見えます。

コレクションの述語を確認する必要がある場合は、FirstOrDefaultの使用を検討してください。

+1

'continue'?ループの最後のステートメントです。 – paislee

+0

コードは短縮されたサンプルのように見えます - イアン・ホートンは「見つかった」ケースもあれば何かをしているはずですが、サンプルが残っているので無駄です。私はsampleがJQueryの翻訳であると考えています。ここでreturnは本質的に続行します。 –

1

答えを記録するにはブール値を追加します。

bool found = false; 
foreach (var currentCheckBox in loadedObj.Settings.Where(currentCheckBox => currentCheckBox != null)) 
{  
    // docTypeAlias is a single string that needs to be matched 
    var docTypeAlias = sender.ContentType.Alias; 
    // This is the current value of currentCheckBox 
    var requiredTypeAlias = currentCheckBox; 
    if (requiredTypeAlias.Equals(docTypeAlias)) { 
     found = true; 
     break; 
    } 
} 
if (!found) return; 

また、この別の関数にする:私はそれをよく理解場合は、代わりにこれを使用することができると思い

private void eventhandler(object sender, EventArgs e) 
{ 
    if (!ControlIsListed(sender, loadedObj)) return; 
    // ... 
} 
0
bool doAnyMatch = loadedObj 
        .Settings 
        .Where(x => x != null) 
        .Any(x => x.Equals(docTypeAlias)); 

if(!doAnyMatch) return; 
0

bool ControlIsListed(object sender, MySettingsClass loadedObj) 
{ 
    foreach (var currentCheckBox in loadedObj.Settings.Where(currentCheckBox => currentCheckBox != null)) 
    {  
     // docTypeAlias is a single string that needs to be matched 
     var docTypeAlias = sender.ContentType.Alias; 
     // This is the current value of currentCheckBox 
     var requiredTypeAlias = currentCheckBox; 
     if (requiredTypeAlias.Equals(docTypeAlias)) return true; 
    } 
    return false; 
} 

し、それを呼び出します

loadedObj.Settings.Find(delegate(String currentCheckBox) 
{ 
    return sender.ContentType.Alias == currentCheckBox 
}); 

何かが見つかった場合はnullでない場合はstringを返します。

関連する問題