而不是像c#那样开始关注0的每一个值,我想知道是否有办法从一个特定的数字开始,比如-1,而不必循环通过在初始化后用-1替换每个0?
答案 0 :(得分:5)
使用类似的东西
var myArray = Enumerable.Repeat(-1, 1000000).ToArray();
答案 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();
祝你好运!