2013-08-29 27 views
-1

我是新來的Python背景的C#。c# - 有沒有辦法用值類型克隆數組,而不創建新的引用類型?

在Python中,我能做到這樣:

a = [1, 5, 10] #initialize 

a = [1, 3, 5] #change the value 

我怎麼能執行a = {1, 3, 5}在C#?目前我找到了這種方式。

int[] a = {1, 5, 10}; //initialize 

int[] b = {1 ,3, 5}; //create new reference type 

a = (int[])b.Clone(); //change the value 

有沒有什麼更好的方法來改變從{1, 5, 10}整個陣列a{1 ,3, 5}

a = [1, 3, 5] python to C#?

回答

4

也許我失去了一些東西,但肯定只是......

a = new int[]{1, 3, 5}; 
1

是的,你可以使用indexer(這是從零開始)

a[2] = 5; 

如果你想改變整個數組,然後分配給它一個新的參考,像

int[] a = new[] {1, 2, 10}; 
a = new[] {1,2,5}; 

你原來的數組將會失去對它的所有引用,並受到GC的約束。第二行分配a對新陣列的引用。

+0

對不起,讓我感到困惑,其實我想問一下如何在c#上實現這個目標。 –

+0

即C#,看不出有什麼問題。 – oleksii

+0

但我想將整個數組從{1,5,10}更改爲{1,3,5},而不僅僅是基於您的答案的一個索引。 –

1

a像Python中的變量。

當您分配給變量a = {1, 5, 10}時,它將引用的值分配給變量中的數組。這是分配數組的簡寫語法。

要重新分配變量,只需使用new運算符a = new[] {1, 5, 5}再次分配給它。

樣品:

int[] a = {1, 5, 10}; // Shorthand syntax for creating array 

a = new[] {1, 5, 5}; // Reassign using new operator 

Array initializers

1

[編輯:看來,OP不想使現有陣列的複製,但只是爲了創造一個全新的一個。但我會留在這裏以防萬一。]

這是創建不僅僅是對原始數組的引用的數組副本的正常方法。

有一個更快的方法來做,它直接使用Array.Copy()。您可以在擴展方法把它包起來,使其更易於使用:

/// <summary>Shallow clones an array.</summary> 
/// <typeparam name="T">The type of array elements.</typeparam> 
/// <param name="array">An array to clone.</param> 
/// <returns>The cloned array.</returns> 
/// <remarks>This is much faster than the built-in <see cref="Array.Clone"/> method.</remarks> 

public static T[] ShallowClone<T>(this T[] array) 
{ 
    if (array == null) 
    { 
     throw new ArgumentNullException("array"); 
    } 

    T[] result = new T[array.Length]; 
    Array.Copy(array, result, array.Length); 
    return result; 
} 

通常你會不會擔心性能,但是這確實發生比使用Array.Copy()更快。

您可以使用它像這樣:

int[] a = {1, 2, 3}; 

int[] b = a.ShallowClone(); 

這樣一來,它的速度更快你不需要投(雖然你當然也可以寫一個使用Array.Clone()擴展方法。)

相關問題