2012-02-29 2 views
0

Я пытаюсь перебрать список строк и проверить их на одну строку. Если ничего не найдено, что соответствует, нам нужно выйти из кода.Пронумеровать список и «вернуть», если нет совпадений

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

Извините, это было имя, скопированное из какого-то другого кода, на самом деле это список элементов checkBox, которые читаются из XML-файла. –

ответ

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

Это очень нравится Энтони, спасибо. –

+0

+1 для психического ответа. :) –

0

Похоже, вы хотите «продолжить» (чтобы пропустить оставшуюся часть кода в Еогеаспе и проверьте следующий пункт) вместо «возврата», который возвращается из функции.

Рассмотрите возможность использования FirstOrDefault, если вам просто нужно проверить предикат в коллекции.

+1

'продолжать'? это последнее утверждение в цикле. – paislee

+0

Код выглядит мне как укороченный образец - Ян Хьютон должен что-то делать, если «найденный» случай тоже ... но да для образца, поскольку он есть, продолжается бесполезно. Я думаю, что образец - это перевод JQuery.each, где возвращение по существу продолжит. –

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.

Смежные вопросы