循环列表并仅在没有匹配时“返回”

时间:2012-02-29 00:45:45

标签: c# loops

我正在尝试遍历字符串列表并针对单个字符串进行检查。如果找不到匹配的内容,那么我们需要退出代码。

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

如果“设置”中只有1个字符串,则代码可以正常工作,但只要有多个字符串,如果第一个字符串不匹配,代码就会很快退出。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
    // ...
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

bool doAnyMatch = loadedObj
                    .Settings
                    .Where(x => x != null)
                    .Any(x => x.Equals(docTypeAlias));

if(!doAnyMatch) return;

答案 4 :(得分:0)

如果我理解的话,我认为你可以使用它

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

如果找到了某些内容,则会返回string,如果不是null