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

本文关键字:返回 列表 遍历 循环 | 更新日期: 2023-09-27 18:26:01

我正在尝试遍历字符串列表并对照单个字符串检查它们。如果未找到匹配项,则需要退出代码。

// 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 个字符串,则代码工作正常,但是一旦有多个字符串,如果第一个字符串不匹配,则代码会过早退出。

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

您可以使用

Any来查看序列中的任何元素是否与您的条件匹配。如果没有这样做,结果将是错误的。

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

添加一个布尔值来记录答案。

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

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

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

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

我想你可以改用它,如果我理解得很好

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

如果找到某些内容,它将返回string(如果不是null(。