2012-06-25 70 views
3

我想有一個映射功能,這是否:混合ref和params關鍵字是不可能的?

public static void Map<T>(IEnumerable<T> src, params T[] dst) 
{ 
    for (int i = 0; i < dst.Length; i++) 
     dst[i] = src.ElementAt(i); 
} 

爲了使這項工作DST也必須被宣佈爲參考,這似乎並不可能。

這是一個虛數單位測試使用:

int a = 0, b = 0, c = 0; 
int[] arr = { 1, 2, 3 }; 
Tools.Map(arr, a, b, c); 
Assert.AreEqual(a, 1); 
Assert.AreEqual(b, 2); 
Assert.AreEqual(c, 3); 

這是可能的呢?它已經存在嗎?這會是一個壞主意嗎?

編輯:換句話說,我怎麼給這個實現的參數的任意數目:

public static void Map3<T>(IEnumerable<T> src, ref T a, ref T b, ref T c) 
{ 
    a = src.ElementAt(0); 
    b = src.ElementAt(1); 
    c = src.ElementAt(2); 
} 
+0

是的,這裏有很多不好的東西,甚至在你的不好主意之前; p對於初學者,你正在複製現有的功能。 ('Enumerable.ToArray()')。 – leppie

+0

否。轉換不是從IEnumerable轉換爲數組,而是從IEnumerable轉換爲任意數量的單獨變量。 – ndn

+0

無法看到如何將數組作爲'ref'會產生任何影響。您不是在函數中爲實際數組分配新值。 – Magnus

回答

4

你不能做到這一點。 Params是C#編譯器的一個方便之處,它只是在現場創建一個數組,並用參數填充它。

由於數組不能包含「ref」變量,因此您也不能以這種方式將「ref」傳遞給params。

您正在尋找類似於某些語言所具有的「多項任務」的內容。如果它的存在,它的工作是這樣的:

my (a,b,c,d) = enumerable.ToArray(); 

參見:C#: Split string and assign result to multiple string variables

你可能會考慮一組擴展方法:

public static void ReadValues<T>(this T[] array, ref T t0){ 
    t0 = array[0]; 
} 
public static void ReadValues<T>(this T[] array, ref T t0, ref T t1){ 
    t0 = array[0]; 
    t1 = array[1]; 
} 

等,最多的許多參數正如你想支持的那樣。

這不是一個任意數字,但是20對於大多數目的來說應該足夠高。嘿,如果不是這樣,只要走高一點。

然後你可以使用它像這樣:

enumerable.ToArray().ReadValues(var1, var2, var3);  

你甚至可以用切片結合該讀取任意條目:

// reads indexes 3 to 7 
enumerable.ToArray().Slice(3,4).ReadValues(var1, var2,var3,var4); 

見切片這裏:

+0

你是對的。其實,我只是在尋找一種分配變量的便捷方式。 – ndn

+0

編輯完成後,這是完美的答案。我正在尋求避免寫出t0 = arr [0] ... tn = arr [n]但是確定。謝謝。 – ndn