Как проверить, является ли строковый массив логическим - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно проверить, чтобы все значения были только «0» или «1» в строковом массиве, и безуспешно пробовал следующий код:

bool isBool = Array.TrueForAll(str, val => val.Trim() == "0" || val.Trim() == "1");

и

bool isBool = str.All(val => val.Trim() == "0" || val.Trim() == "1");

Есть ли другой способ сделать это, потому что я использую ||состояние

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Попробуйте это

var isBool = !str.Select(s => s.Trim()).Distinct().Any(s => s != "0" && s != "1");
0 голосов
/ 21 февраля 2019

Я предполагаю, что вы имеете в виду, что значения должны быть исключительно все 1 или 0?В этом случае вам нужно протестировать каждый случай отдельно.Ваш существующий код имеет значение true, когда массив содержит только 0 или 1.Было бы неверно, если любое из значений было 2, хотя.Одно из решений:

var allAreZero = new string[] { "  0  ", "  0", "  0" };
var allAreOne = new string[] { "  1  ", "1", "  1" };
var mixedOnesAndZeros = new string[] { "  1  ", "0", "  1" };

private bool ArrayIsExclusivelyTrueOrFalse(string[] data)
{
    return data.All(i => int.TryParse(i, out int value) && value == 0) ||
           data.All(i => int.TryParse(i, out int value) && value == 1);
}

ArrayIsExclusivelyTrueOrFalse(allAreZero);          // true
ArrayIsExclusivelyTrueOrFalse(allAreOne);           // true
ArrayIsExclusivelyTrueOrFalse(mixedOnesAndZeros);   // false
0 голосов
/ 22 февраля 2019

Если вы хотите убедиться, что все значения в вашем массиве являются либо ALL "0", либо ALL "1" (но не сочетанием "0" и "1", как я его первоначально читал), то в одну сторонубудет гарантировать, что число Distinct элементов (после обрезки) имеет Count из 1 (что означает, что они все одинаковые), и что элемент является членом набора допустимых значений (вкод ниже, мы просто проверяем первый элемент, так как мы уже знаем, что они все одинаковы на данный момент).

Например:

var validValues = new[] {"0", "1"};
var isBool = str.Select(i => i.Trim()).Distinct().Count() == 1 &&
             validValues.Contains(str[0].Trim());
0 голосов
/ 21 февраля 2019

вы можете попробовать Any () и вернуться в первое неисправное состояние !str.Any(x => x.Trim() != "0" && x.Trim() != "1")

...