在纯 LINQ 中是这样的:
var parts = Enumerable.Range(0, (binaryString.Length + 7) / 8)
.Select(p => binaryString.Substring(p * 8, Math.Min(8, binaryString.Length - (p * 8))))
.ToArray();
它非常复杂,因为它能够“解析”小于 8 个字符的范围。所以:
string binaryString = "123456781234567"
将返回 12345678、1234567
(binaryString.Length + 7) / 8)
这是我们将拥有的零件数量。我们必须清楚地四舍五入,所以“0”是一个部分,“123456781”是两个部分。通过添加 (divisor - 1) 我们四舍五入。
Enumerable.Range(0, (binaryString.Length + 7) / 8)
这将给出一系列数字 0, 1, 2, # of parts - 1
.Select(p =>
选择:-)
binaryString.Substring(p * 8, Math.Min(8, binaryString.Length - (p * 8))))
子串
p * 8
起点,零件编号* 8,(所以零件#0从0开始,零件#1从8开始......)
Math.Min(8, binaryString.Length - (p * 8)))
通常它会是 8,但最后一部分可能会更短。它表示剩余字符的Min
中间8
和数量。
使用正则表达式可能更容易:
var parts2 = Regex.Matches(binaryString, ".{1,8}")
.OfType<Match>()
.Select(p => p.ToString())
.ToArray();
(捕获 1-8 个字符的组,任何字符,然后将匹配项放入数组中)