У меня 4 логических значения, и это может быть один, комбинация нескольких или ни одного. Мой конечный результат будет заключаться в том, что я знаю, для каких bool установлено значение true.

Например: только один / только один и два / только один, два и три / все один, два , три, четыре / только два и три / и так далее ..

Я начал с написания их вручную, используя операторы If -, но затем я начал понимать: 1: этот код выглядит очень запутанным. 2: этот метод потребует много усилий 3. Должен быть способ лучше, не так ли?

0
iLIKEtea 9 Окт 2020 в 19:26

2 ответа

Лучший ответ

Если у вас есть коллекция логических значений, например

 bool[] flags = new bool[] {
   first,
   second,
   third,
   ...
   last 
 };

Вы можете запросить их с помощью Linq :

using System.Linq;

... 

if (flags.All(x => x)) {
  // if all booleans are true 
}

if (flags.Count(x => x) == 2) {
  // if exactly two booleans are true 
} 

if (flags.Count(x => x) >= 3) {
  // if at least 3 booleans are true 
} 

if (flags.Count(x => x) <= 4) {
  // if at most 4 booleans are true 
} 

if (flags.Any(x => x)) {
  // if at least 1 boolean is true; 
  // it can be done with a help of Count, but Any is more readable 
} 
2
Dmitry Bychenko 10 Окт 2020 в 17:15

Если вы хотите вывести их с какими-то именами в дополнение к только значениям bool, как предлагает ответ добавить имя в виде текста:

var flags = new[]
   { 
     new { Value = one,   Name = nameof(one)},
     new { Value = two,   Name = nameof(two)},
     new { Value = three, Name = nameof(three) }
   };

var trueCount = flags.Count(x => x.Value);
var names = String.Join(",", flags.Where(x => x.Value).Select(x => x.Name));

if (trueCount == 0) return $"none";
if (trueCount == 1) return $"just {names}";
else if (trueCount < flags.Length) return $"only {names}";
else return $"all {names}";

Примечание: переключение на перечисление [Flags] может быть полезно, если вы хотите сделать больше, чем просто считать истину / ложь. В качестве альтернативы рассмотрите возможность перехода на Dictionary<string, bool>.

0
Alexei Levenkov 9 Окт 2020 в 17:00