Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq将布尔[]转换为字节[]_C#_Arrays_Linq_Byte_Bit - Fatal编程技术网

C# Linq将布尔[]转换为字节[]

C# Linq将布尔[]转换为字节[],c#,arrays,linq,byte,bit,C#,Arrays,Linq,Byte,Bit,我有一个数组中的布尔值列表 bool[] items = { true, true, true, true, true, true, true, true, //#1 false, false, false, false, false, false, false, true, //#2 false, false, false, false, false, false, true , true //#3

我有一个数组中的布尔值列表

bool[] items = { true, true, true, true, true, true, true, true,  //#1
                 false, false, false, false, false, false, false, true,  //#2
                 false, false, false, false, false, false, true , true  //#3
               };

linq有没有一种简单的方法可以将其转换为
字节[]

//expected result
byte[] result = { 255, 1, 3 };

“使用linq有没有一种简单的方法可以将其转换为
字节[]
?”我不知道我是否可以称之为简单,它当然不漂亮,但这似乎是可行的:

        byte[] result = Enumerable.Range(0, items.Length / 8)
            .Select(i => (byte)items.Select(b => b ? 1 : 0)
                              .Skip(i * 8)
                              .Take(8)
                              .Aggregate((k, j) => 2 * k + j))
            .ToArray();

“使用linq有没有一种简单的方法可以将其转换为
字节[]
?”我不知道我是否可以称之为简单,它当然不漂亮,但这似乎是可行的:

        byte[] result = Enumerable.Range(0, items.Length / 8)
            .Select(i => (byte)items.Select(b => b ? 1 : 0)
                              .Skip(i * 8)
                              .Take(8)
                              .Aggregate((k, j) => 2 * k + j))
            .ToArray();

因此,您有一个布尔值序列,并且希望将每8个连续布尔值的值转换为一个字节,其中位模式等于8个布尔值,其中最高有效位(MSB)位于第一位

转换分两步进行:

  • 将序列分成8个布尔值的组
  • 将每组8个布尔值转换为一个字节
为了保持可读性,我创建了IEnumerable的扩展函数。看

静态类EnumerableExtensions
{
公共静态IEnumerable ToBytes(此IEnumerable bools)
{
//将布尔序列转换为具有相同8位的字节
//阵列中的模式为8个布尔值;MSB优先
如果(bools==null)抛出新的ArgumentNullException(nameof(bools));
//当有元素时,取8,并转换为字节
while(bools.Any())
{
IEnumerable eightBools=bools.Take(8);
Byte convertedByte=eightBools.ToByte();
产生返回convertedByte();
//删除八个bool;进行下一次迭代
bools=bools.Skip(8);
}
}
公共静态字节ToByte(此IEnumerable bools)
{//转换布尔序列的前8个元素
//转换为具有相同二进制位模式的一个字节
//示例:00000011=3
如果(bools==null)抛出新的ArgumentNullException(nameof(bools));
var boolsToConvert=bools.Take(8);
//皈依
字节结果=0;
int index=8—源文件长度;
foreach(boolsToConvert中的bool b)
{
如果(b)

结果|=(字节)(1因此,您有一个布尔值序列,并且希望将每8个连续布尔值的值转换为一个字节,其中位模式等于首先具有最高有效位(MSB)的8个布尔值

转换分两步进行:

  • 将序列分成8个布尔值的组
  • 将每组8个布尔值转换为一个字节
为了保持可读性,我创建了IEnumerable的扩展函数

静态类EnumerableExtensions
{
公共静态IEnumerable ToBytes(此IEnumerable bools)
{
//将布尔序列转换为具有相同8位的字节
//阵列中的模式为8个布尔值;MSB优先
如果(bools==null)抛出新的ArgumentNullException(nameof(bools));
//当有元素时,取8,并转换为字节
while(bools.Any())
{
IEnumerable eightBools=bools.Take(8);
Byte convertedByte=eightBools.ToByte();
产生返回convertedByte();
//删除八个bool;进行下一次迭代
bools=bools.Skip(8);
}
}
公共静态字节ToByte(此IEnumerable bools)
{//转换布尔序列的前8个元素
//转换为具有相同二进制位模式的一个字节
//示例:00000011=3
如果(bools==null)抛出新的ArgumentNullException(nameof(bools));
var boolsToConvert=bools.Take(8);
//皈依
字节结果=0;
int index=8—源文件长度;
foreach(boolsToConvert中的bool b)
{
如果(b)

结果|=(字节)(1我的不好,尽管这是另一个简单的问题。几乎是重复的答案。虽然您正在转换表示为布尔值的位,因此存在一个更简单的答案。“linq有没有一种简单的方法来转换这个?”Easy是相对的和主观的。我会说不。当然可能。为什么如此坚持LINQ?你可能可以用沙拉钳建造一座房子,但是为什么?使用任何使你的代码最容易阅读的东西。我的坏,虽然这是另一个简单的问题。答案几乎是重复的。虽然你正在转换表示为布尔的位,所以更容易的答案是“linq有没有一种简单的方法来转换这个”easy是相对的和主观的。我想说不。当然可能。为什么如此坚持linq?你可能可以用色拉钳建造一座房子,但为什么?使用任何使你的代码最容易阅读的东西。
IEnumerable<bool> items = ...
IEnumerable<Byte> convertedItems = items.ToBytes();