我知道C#中实例化的值类型数组会自动填充类型的默认值(例如,对于bool为false,对于int为0等).
有没有办法使用不是默认值的种子值自动填充数组?之后是创建还是内置方法(比如Java的Arrays.fill())?假设我想要一个默认为true的布尔数组,而不是false.是否有内置的方法来执行此操作,或者您只需要使用for循环遍历数组?
// Example pseudo-code:
bool[] abValues = new[1000000];
Array.Populate(abValues, true);
// Currently how I'm handling this:
bool[] abValues = new[1000000];
for (int i = 0; i < 1000000; i++)
{
abValues[i] = true;
}
Run Code Online (Sandbox Code Playgroud)
必须遍历数组并将每个值"重置"为true似乎是无效的.有没有办法解决?也许通过翻转所有价值观?
在输出这个问题并思考之后,我猜测默认值只是C#如何在幕后处理这些对象的内存分配的结果,所以我想这可能不可能做到这一点.但我仍然想知道!
我需要byte[]用一个非零值填充一个.如何在C#中执行此操作而不循环遍历byte数组中的每个?
更新:评论似乎将此分为两个问题 -
memset我完全同意,正如埃里克和其他人所指出的,使用一个简单的循环就可以了.问题的关键是看我是否可以学习一些关于C#的新东西:)我认为Juliet的并行操作方法应该比简单的循环更快.
基准: 感谢Mikael Svenson:http://techmikael.blogspot.com/2009/12/filling-array-with-default-value.html
事实证明,for除非你想使用不安全的代码,否则简单的循环是可行的.
抱歉我的原帖不清楚.埃里克和马克的评论都是正确的; 需要有更多专注的问题.感谢大家的建议和回应.
在C#中处理以下情况的最佳方法是什么?
我有一个用C/C++编写的服务器应用程序.
例如,它创建一个unsigned char长度缓冲区256.在此缓冲区中,服务器存储客户端发送给它的数据.存储后,对接收的缓冲区进行一些加密检查.
我正在用C#为这台服务器编写一个客户端.
问题是服务器期望固定长度为256的缓冲区.
当我创建一个byte[]内容和总长度为256的数组时,加密检查失败.
我发现的原因很简单.服务器需要256字节长的缓冲区.例如,如果消息是"Hello World",则缓冲区的其余部分必须为0填充.或者,更好地解释:字节需要(unsigned) "204"或 (signed) "-52".
我认为这是一个C/C++概念问题.
为了解决我的问题,我明确地设置了该值.
public static byte[] GetCBuffer(this byte[] data, int len)
{
byte[] tmp = new byte[len];
for(int i = 0; i < len; i++)
if(i < data.Length)
tmp[i] = data[i];
else
tmp[i] = 204;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来处理这些艺术预期的字节?我没有看到必要的东西吗?