标签: array-initialization

C#中的数组连接

  1. 如何在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)
  2. 另一个问题:如何有效地连接C#数组?

c# arrays initialization concatenation array-initialization

4
推荐指数
3
解决办法
2万
查看次数

为什么数组初始化总是求助于int?

阅读所有可能的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)的优化.

c# arrays type-conversion array-initialization

4
推荐指数
1
解决办法
297
查看次数

构造函数歧义与数组初始值设定项

我有一个问题,即在使用 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)

c++ array-initialization visual-studio-2017

4
推荐指数
1
解决办法
87
查看次数

并行化数组创建

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>>

f# array-initialization

3
推荐指数
1
解决办法
313
查看次数

F#:为什么Array.createZero这么快?

我有这个代码:

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快速创建数组并确保其所有元素都具有默认值?在其他语言中,我知道没有这样的可能性(据我所知).在其他语言中,我只知道数组的快速初始化,哪些元素不能保证具有默认值,因为它们可以在存储器中初始化,其中存在一些垃圾.

谢谢!

arrays f# initialization array-initialization

3
推荐指数
1
解决办法
353
查看次数

C# - 我可以使用数组初始化程序构建一个字节数组吗?

我想使用数组初始化程序从另一个字节数组中构建一个字节数组,以及构成标题/尾部的其他一些字节.基本上,我想做这样的事情:

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(),但它感觉有点笨重.

c# byte bytearray array-initialization

3
推荐指数
1
解决办法
255
查看次数

c#中的通用参数

我有这个课程:

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)

c# inheritance where array-initialization

2
推荐指数
1
解决办法
204
查看次数

何时使用tick(')进行Verilog数组初始化?

数组初始化可以使用或不使用':

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

arrays verilog system-verilog array-initialization

2
推荐指数
1
解决办法
3万
查看次数

gcc编译器报告警告,但a.out工作顺利

我正在关注"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)

c array-initialization designated-initializer

2
推荐指数
1
解决办法
56
查看次数

为什么{0}分配有效但数组不为{5}

我尝试了以下代码:

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循环)

c arrays array-initialization

2
推荐指数
1
解决办法
124
查看次数