如何将0和1的字符串转换为布尔数组

时间:2018-05-20 21:41:40

标签: c# arrays

基本上,标题说明了我想要做的事情。

我有一个如下字符串。

1 0 1 0 1
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0
1 0 1 0 1

我希望将其转换为二维布尔数组(显然,0 -> false1 -> true)。我目前的方法是删除非linebreak-whitespace,然后遍历字符串的行。

这使我将10101之类的字符串转换为true, false, true, false, true的布尔数组。现在,我希望有预先存在的方法来进行此转换 - 使用Java,我非常确定可以使用streams API完成,但不幸的是,我'我还不熟悉C#。

因此,我的问题是:是否存在以紧凑方式进行此转换的现有方法?或者我是否必须手动迭代字符串并对每个字符进行== 0 / ==1比较?

5 个答案:

答案 0 :(得分:5)

单个字符串

如果您有一个类似“10101”的字符串,您可以使用LINQ将其转换为位数组。

string input = "10101";
bool[] flags = input.Select( c => c == '1' ).ToArray();

字符串数组

LINQ对二维数组的效果不是很好,但它适用于锯齿状数组。如果bool[][]可以,则此解决方案应该有效:

string[] input = { "10101","01010" };

bool[][] flags = input.Select
(
    s => s.Select
    ( 
        c => c == '1'
    )
    .ToArray()
)
.ToArray();

答案 1 :(得分:4)

这是一个相对丑陋的“单线”:

string input = "1 0 1 0 1\n0 0 0 0 0\n1 0 0 0 1\n0 0 0 0 0\n1 0 1 0 1";
bool[][] flags = input.Split(new[] { "\n" }, StringSplitOptions.None) // Split into lines, e.g. [ "1 0 1 0 1", "0 0 0 0 0" ]
                      .Select(line => line.Split(' ') // Split each line into array of "1"s or "0"s
                                          .Select(num => num == "1").ToArray()) // Project each line into boolean array
                      .ToArray(); // Get array of arrays

但这是一个可以说更具可读性的版本,可能更接近您的实际用例,例如:一次从用户那里读一行。

string input = "1 0 1 0 1\n0 0 0 0 0\n1 0 0 0 1\n0 0 0 0 0\n1 0 1 0 1";

List<bool[]> list = new List<bool[]>();

string[] lines = input.Split(new[] { "\n" }, StringSplitOptions.None);
foreach (string line in lines) // Could be a different loop that gets lines from the user
{
    string[] chars = line.Split(' '); // Bear with the crappy variable names
    bool[] flagLine = chars.Select(numString => numString == "1").ToArray();
    list.Add(flagLine);
}

bool[][] flags = list.ToArray();

如评论中所述,您可能希望按Environment.NewLine而不是像"\n"这样的字符串进行拆分。不要问我为什么在没有提供整个数组的情况下我们不能用字符串分割 - 尽管可以用extension methods来解决。

答案 2 :(得分:2)

类似的答案@ Sinjai's。这可以通过利用字符串可以@slides[0].link == "https://google.com"作为.Select来实现。

char[]

这适用于你可能有或没有\ r \ n和每1或0之间的空格的场景。如果你有一个看起来像这样的字符串:

var boolVals = yourString.Replace(" ","").Replace("\r","") .Split('\n').Select(x => x.Select(y => y == '1').ToArray()).ToArray();

然后代码会更短:

string yourString = "10101\n10001";

答案 3 :(得分:0)

尝试使用此功能:

static List<bool> AsArray(string boolString)
{
    List<bool> toArray = new List<bool>();
    foreach (char boolChar in boolString)
    {
        if (boolChar == '0')
        {
            toArray.Add(false);
        }
        else if (boolChar == '1')
        {
            toArray.Add(true);
        }
        else
        {
            throw new Exception("String can only be made of 1 and 0.");
        }
    }
    return toArray;
}

答案 4 :(得分:-1)

以下是您想要5x5 bool数组的例子。

try:
  element = "//div[@class='pricingReg']"
  el = driver.find_element(By.XPATH, element)
  el_text = el.get_attribute("innerText")
  print(el_text)
  purchase_unit_label = re.search('^[a-zA-Z]*$', el_text)
  print('Purchase Unit Label =' + purchase_unit_label)
except NoSuchElementException:
  print('Purchase Unit Label NoSuchElementException')