创建一个满-1的数组;

时间:2013-11-27 01:05:39

标签: c# arrays

而不是像c#那样开始关注0的每一个值,我想知道是否有办法从一个特定的数字开始,比如-1,而不必循环通过在初始化后用-1替换每个0?

7 个答案:

答案 0 :(得分:5)

使用类似的东西

 var myArray =  Enumerable.Repeat(-1, 1000000).ToArray();

important note; it is slower than looping manually

答案 1 :(得分:1)

当然可以。

void Main()
{
    var arr = Enumerable.Repeat(-1, 10).ToArray();  
    Console.WriteLine (arr);
}

不完全确定幕后发生了什么,所以它可能仍会循环遍历列表中的值。但这很难避免。

不同的解决方案:

void Main()
{
    var arr = new List<int>(new int[10]).Select(x => x = -1).ToArray();
    Console.WriteLine (arr);
}

答案 2 :(得分:1)

你可以这样做:

public static int[] Initialize( this int[] instance , int value )
{
  if ( instance == null ) throw new ArgumentNullException("instance") ;
  for ( int i = 0 ; i < instance.Length ; ++i )
  {
    instance[i] = value ;
  }
  return instance ;
}

这会让你说出类似

的内容
int[] foo = new int[2048].Initialize(-1) ;

你可能会因为不安全和使用指针而获得性能提升,因为你不会产生数组边界检查的开销,如下所示:

public static unsafe int[] Initialize( this int[] instance , int value )
{
  if ( instance == null ) throw new ArgumentNullException("instance") ;
  fixed ( int *addr = instance )
  {
    int *p    = addr ;
    int *pMax = addr+instance.Length ;
    while ( p < pMax )
    {
      *(p++) = value ;
    }
    return instance ;
  }

如果您只想将数组设置为-1,则可以使用memset()使其更快,因为我们知道所有字节都是0xFF。所以......

    public static unsafe int[] InitializeToMinus1( this int[] instance )
    {
        if ( instance == null ) throw new ArgumentNullException("instance");
        fixed( void *p = instance )
        {
            IntPtr    addr  = new IntPtr(p) ;
            const int hexFF = 0x000000FF ;
            int       bytes = instance.Length * sizeof(int) ;
            memset( addr , hexFF , bytes ) ;
        }
        return instance ;
    }

    [DllImport("msvcrt.dll", EntryPoint="memset", CallingConvention=CallingConvention.Cdecl, SetLastError = false)]
    public static extern IntPtr memset( IntPtr addr , int c , int count ) ;

答案 3 :(得分:0)

您可以使用Repeat

int[] array = Enumerable.Repeat(-1, 5).ToArray();

正如其他地方所提到的,这是语法糖 - 一个循环仍然会运行,你将承担将IEnumerable生成的数据转换回数组的开销。

答案 4 :(得分:0)

尝试:

int[] intArray =  Enumerable.Repeat(-1, [Length]).ToArray();

答案 5 :(得分:0)

Enumerable 类可能有所帮助,如下所示:

IEnumerable<int> array = Enumerable.Repeat(-1, 15);  // or whatever range you'd like

答案 6 :(得分:0)

考虑以下代码......

items =  items.Select(s => s = -1).ToArray();

祝你好运!