2015-05-28 6 views
0

Я новичок в C# и не нахожу ответы на простые вопросы. MSDN может быть очень загадочным для кого-то на моем уровне, и у меня нет специалиста в моем распоряжении для регулярных вопросов, таких как эти.Есть ли (более чистый) способ консолидировать несколько условий в C#?

Это пример кода, я работаю с:

while (ans != "a" || ans != "b" || ans != "c" || ans != "d"); 

Есть ли способ, чтобы очистить это?

+1

Вы можете поместить их в массив и проверить, если ваш 'ans' значение в массиве. –

+10

Вы уверены, что не хотите '&&' там? – Marc

+0

Простейшим было бы вывести уродство поименованному методу, поэтому более очевидно, что означает или все эти значения. – Levesque

ответ

4

Вы можете поместить эти строки в списке и проверьте, если ответ будет в списке

var list = new List<string>{"a", "b", "c", "d"}; 
while (!list.Contains(ans)) { ... } 

Комментарий воспитывается хороший момент. Технически набор лучше для этой задачи, потому что он может сделать просмотр для членства очень быстро

var set = new HashSet<string>{"a", "b", "c", "d"}; 
while (!set.Contains(ans)) { ... } 
+1

Использовать 'HashSet ' для лучшего обеспечения производительности :) – Lukazoid

+0

Я думаю, что комментарий, что это эквивалент '&&', а не '||', может помочь повысить этот ответ, поскольку его очень обычная логическая ошибка для использования 'not или ' – paqogomez

1

Используйте HashSet/словарь быстрый способ делать то, что вы хотите, особенно если список или строки длиной:

var set = new HashSet<string>() {"a", "b", "c", "d"}; 
while (!set.ContainsKey(ans)) { ... } 
+6

Используйте« HashSet »для тех же преимуществ, но без накладных расходов на ключ. – Lukazoid

+0

Словарь здесь действительно не имеет смысла. Если бы он не хранил что-то с каждой буквой. – t3dodson

+0

Замененный словарь HashSet по популярному запросу. –

0
if(new List<string>{"a", "b", "c", "d"}.Any(x=> x == ans)) 
+0

Это создает новый список каждый раз, когда он оценивается, поскольку OP использует цикл while, он может быть неэффективным. – t3dodson

+0

@TomDDD да, это возможно. Недостаточно информации о контексте. Конечно, список можно построить один раз. – Balanikas

-1

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

+2

В зависимости от контекста кода, жертвуя производительностью в названии более чистого кода, * может * быть правильным ответом. Более чистый код более удобен в обслуживании, и я бы сказал, что это правильный выбор. – SefTarbell

+0

Обычно я обычно соглашаюсь с вами, но поскольку мы не знаем контекста того, как и почему этот код используется, я думал, что это не будет правильным предположением. Вот почему я назвал это предупреждением. Просто пища для размышлений. – user3164339

+0

Благодарим вас за понимание. – Hiimmas

0

«Мне нужно что-то, что постоянно оценивалось, если был дан правильный ответ (a, b, c и d - действительные ответы)».

Мне кажется, что если ответ «f» или что-то, что не указано «a», «b», «c» или «d», вам нужно, чтобы пользователь ввел другой ответ. Если это правильно, вам нужно & & вместо ||.

Я бы просто проверил введенный ответ на символы 'a' - 'd', а не как строку. Это позволяет пропустить использование списков, HashSets или Словари.

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("1 + 2 = ?"); 
     Console.WriteLine("a: 1"); 
     Console.WriteLine("b: 2"); 
     Console.WriteLine("c: 3"); 
     Console.WriteLine("d: 4"); 

     Console.Write("Select answer: "); 

     char ans; 
     do 
     { 
      // Only accept the first character, using .ToLower to ignore casing 
      ans = Console.ReadLine().ToLower()[0]; 
      if (ans < 'a' || 'd' < ans) 
      { 
       Console.WriteLine("Please select a, b, c, or d!"); 
      } 
     } while (ans < 'a' || 'd' < ans); // This is your clean up 


     Console.WriteLine(ans == 'c' ? "You are correct!" : "You are incorrect!"); 
    } 
} 

Результаты:

1 + 2 = ? 
a: 1 
b: 2 
c: 3 
d: 4 
Select answer: l 
Please select a, b, c, or d! 
m 
Please select a, b, c, or d! 
o 
Please select a, b, c, or d! 
c 
You are correct! 

См рабочий пример здесь ... https://dotnetfiddle.net/us7D3K