2012-02-29 85 views
0

我正在尝试遍历字符串列表并检查它们是否针对单个字符串。如果没有找到匹配,那么我们需要退出代码。如果只有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如何成为一个字符串列表?你的代码也会尝试任何与你的文本无关的东西。你可以编辑来澄清类型,你的实际目标是什么? – 2012-02-29 00:53:44

+0

为什么不使用常规的'foreach'循环? – udidu 2012-02-29 00:55:51

+0

对不起,这是从其他代码复制的名称,它实际上是从xml文件读入的checkBox项目列表。 – 2012-02-29 01:04:19

回答

1

您可以使用Any来查看序列中是否有任何元素符合您的条件。如果没有,结果将是错误的。

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

这对Anthony很有帮助,非常感谢。 – 2012-02-29 01:04:39

+0

+1为心理答案。 :) – 2012-02-29 01:08:43

0

看起来你想要的“继续”(跳过的foreach的代码的其余部分,并检查下一个项目),而不是从函数返回“回报”。

考虑使用FirstOrDefault,如果您只需检查集合上的某些谓词。

+1

'继续'?这是循环中的最后一个陈述.. – paislee 2012-02-29 00:52:55

+0

代码在我看来就像缩短的样本 - 伊恩霍顿应该做的事情,如果“发现”的情况下...但是样本,因为它是继续是没用的。我认为样本是JQuery.each的翻译,其中返回将基本上继续。 – 2012-02-29 00:56:46

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; 

或者,这让一个单独的函数:

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; 
} 

里调用:

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

我想你可以用这个来代替,如果我理解得很好

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

如果发现有问题,将返回string,如果不是null