如何在C#中使用两个(或更多)其他数组巧妙地初始化数组?
double[] d1 = new double[5];
double[] d2 = new double[3];
double[] dTotal = new double[8]; // I need this to be {d1 then d2}
Run Code Online (Sandbox Code Playgroud)另一个问题:如何有效地连接C#数组?
阅读所有可能的C#数组初始化语法我想知道为什么C#总是推断int/Int32一个较小数据类型的数组,例如byte或者short就足够了.
new[] { 30, 130, 230 } // sbyte[] suffices but becomes int[]
new[] { -1, 125, -119 } // sbyte[] suffices but becomes int[]
new[] { -31647, -1337, 23456} // short suffices but becomes int[]
Run Code Online (Sandbox Code Playgroud)
在引用的问题中,Eric Lippert表示使用了"最佳类型" - 见下文,但int最好的类型是怎样的?如果我们想要矫枉过正,为什么不使用long呢?
数组元素的类型是通过计算具有类型的所有给定元素的最佳类型(如果有的话)来推断的.所有元素必须可以隐式转换为该类型.
我怀疑处理8位或16位数据类型可能比32位结构更快,例如当使用SIMD时,其中四个byte实例可以适合一个寄存器空间int/Int32.我知道JIT编译器没有(广泛地)使用SSE指令,但是" int无处不在"的这种使用确保了当JIT编译器将包含这样的优化时它将没有多大帮助.
有人可以详细说明这些事实,并告诉它为什么总是采取行动int?
//编辑//
我真的不关心那些规定没有前缀的文字应该被认为是规范的规范int.重新解释一下这个问题:
为什么使用的数据类型比需要的大?为什么规范对文字有这个规则? 有什么好处,因为巨大的缺点是远离未来(SIMD)的优化.
我有一个问题,即在使用 VS2017(C++14、C++17 和 ISO 最新版本)时,我无法将某个构造函数与数组初始值设定项一起使用。
当它应该使用填充有单个元素的容器调用构造函数时,我收到C2397 conversion from 'double' to 'unsigned int' requires a narrowing conversion错误。
#include <vector>
class obj
{
public:
obj(const std::vector<double>& values, unsigned int stride)
: values_(values), stride_(stride)
{
}
obj(unsigned int m, unsigned int n)
: stride_(n)
{
}
private:
unsigned int stride_;
std::vector<double> values_;
};
int main(int argc, char** argv)
{
obj m(1, 1); // correct constructor called.
obj mm({ 42.0 }, 1); // Error C2397
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以通过显式声明容器来解决这个问题......
obj mm(std::vector<double>({ 42.0 …Run Code Online (Sandbox Code Playgroud) F#
[|for index in 1 .. items.Count()-1 -> (* create object here - complex operations *)|]
Run Code Online (Sandbox Code Playgroud)
C#
Object[] newItemArray= new Object[items.Count];
Parallel.For(0, items.Count, index=>
{
/*complex stuff here*/
newItemArray[index] = new Object();
});
Run Code Online (Sandbox Code Playgroud)
我有上面的C#和F#做同样的事情.没有Parallel.ForF#稍微快一些.使用Parallel.ForC#需要执行一半的时间.如何正确并行化F#以获得与C#相同的性能提升?
我到目前为止尝试的方式是Array.Parallel.Iteri,所以我可以使用相同的索引到我在C#中使用的数组技巧,但它减慢了它而不是加速它.
编辑:
关于我正在做什么的更多细节:
我有一个可枚举的byte array array array.我有另一个byte array array array我正在比较其他人.我正在对可比较的%相似性进行排序并返回前500个.
在F#和C#中我都在做一个简单的嵌套for循环,它增加了一个计数器.完成循环遍历我的枚举中的特定项目时,我创建了一个元组(项目,计数器).一旦完成创建我的新枚举(项目,计数器),我在计数器变量上排序,抓住前500,然后转换回只是一个可枚举的项目.
我在Parallel.For中放置的部分是创建的 IEnumerable<Tuple<item, int>>
我有这个代码:
let timer = new System.Diagnostics.Stopwatch()
timer.Start()
Array.zeroCreate<int> 100000000
timer.Stop()
printfn "%ims" timer.ElapsedMilliseconds
timer.Reset()
timer.Start()
Array.create 100000000 0
timer.Stop()
printfn "%ims" timer.ElapsedMilliseconds
Run Code Online (Sandbox Code Playgroud)
我测试了它并得到了这些结果:
0ms
200ms
Run Code Online (Sandbox Code Playgroud)
如何Array.zeroCreate快速创建数组并确保其所有元素都具有默认值?在其他语言中,我知道没有这样的可能性(据我所知).在其他语言中,我只知道数组的快速初始化,哪些元素不能保证具有默认值,因为它们可以在存储器中初始化,其中存在一些垃圾.
谢谢!
我想使用数组初始化程序从另一个字节数组中构建一个字节数组,以及构成标题/尾部的其他一些字节.基本上,我想做这样的事情:
byte[] DecorateByteArray(byte[] payload)
{
return new byte[] { 0, 1, 2, payload.GetBytes(), 3, 4, 5};
}
Run Code Online (Sandbox Code Playgroud)
GetBytes() 不幸的是,上面是虚构的.
这有什么好的/优雅的方式吗?我通过使用a BinaryWriter将所有内容写入a MemoryStream,然后将其转换为字节数组来解决这个问题MemoryStream.ToArray(),但它感觉有点笨重.
我有这个课程:
interface Info{}
class AInfo : Info { }
class BInfo : Info { }
class SendInfo {
static public f_WriteInfo(params Info[] _info) {
}
}
class Test {
static void Main() {
SendInfo.f_WriteInfo(
new[] {
new AInfo(){ ... },
new BInfo(){ ... },
} );
// This will generate an error.
// There will be need casting between new and [] like new Info[]
}
}
Run Code Online (Sandbox Code Playgroud)
没有铸造有没有办法做到这一点?
喜欢:
class SendInfo {
static public f_WriteInfo(params T _info) where T : …Run Code Online (Sandbox Code Playgroud) 数组初始化可以使用或不使用':
int a[8] = '{0,1,2,3,4,5,6,7}; // Packed
int b[8] = {0,1,2,3,4,5,6,7}; // Unpacked
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法,假设数组使用不可压缩的类型,如int,string等?两种方式似乎都很好.
EDA Playground的完整代码示例:http://www.edaplayground.com/x/3Tc
我正在关注"C Primer Plus"一书并遇到这样一段代码:
// designate.c -- use designated initializers
#include <stdio.h>
#define MONTHS 12
int main(void)
{
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
int i;
for (i = 0; i < MONTHS; i++)
printf("%2d %d\n", i+1, days[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它在编译时报告错误:
$ cc designate.c
designate.c:6:57: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
^~
designate.c:6:29: note: previous initialization is …Run Code Online (Sandbox Code Playgroud) 我尝试了以下代码:
int a[4] = {0};
int b[4] = {5};
int c[4];
printf("%d %d %d %d %d %d\n", a[0], a[3] , b[0], b[3], c[0], c[3]);
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
0 0 5 0 random random
Run Code Online (Sandbox Code Playgroud)
虽然我得到了为什么我得到了c数组的随机值,我不明白为什么分配{5}不起作用{0},只是初始化数组的第一个元素.
有没有办法将数组b元素初始化为不同于0的相同值?(不使用memset或for循环)