2009-08-19 41 views
0

我們有兩個組字符串數組,例如:C# - Generics-串陣列處理

string[] a = new string[] {"value1","value2","value3"}; 
string[] b = new string[] {"value1","value2","value3"}; 

我必須開發一種應採取這兩個字符串數組的通用方法作爲參數 和應返回合併一個回:

public T[] ArrayItms(T1[] a, T2[] b) 
{ 
    return T[]; 
} 

我有點困惑,在泛型中這樣做。

回答

7

您可以使用LINQ來做到這一點:

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

或者,通過複製陣列做手工:

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    T[] result = new T[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

在這兩種情況下,謹防未初始化paremeters(在上面的例子中沒有這樣做碼)。

+0

只是我還是會失敗。 T1和T2沒有定義,不能轉換爲T – LorenVS 2009-08-19 15:26:43

+0

好!有很多很好的新方法支持LINQ。 – akmad 2009-08-19 15:26:46

+0

@Loren:我現在修好了。使用不同的參數類型可能實際上是有意義的,但是(如果它們以某種方式可以相互轉換)。我會暫時放棄它,看看OP有什麼話要說。 – 2009-08-19 15:27:46

0

做沒有泛型然後用T.

3

這裏是一個非常簡單的實現:

public T[] Combine<T>(IEnumerable<T> a, IEnumerable<T> b) 
{ 
    List<T> result = new List<T>(a); 

    result.AddRange(b); 

    return result.ToArray(); 
} 
1

嗯...這似乎並沒有遵循正確的泛型的規則,你的陣列參數應該具有相同的類型,像這樣:

public T[] ArrayItems<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

或者,你可以做這樣的事情:

public T[] ArrayItems<T,T1,T2>(T1[] a, T2[]b) where T1 : T where T2 : T 
{ 
    return a.Select(i => (T)i).Concat(b.Select(i=>(T)i)).ToArray(); 
} 
0

您可以使用LINQ來做到這一點,因此應該將它更改爲

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

注意不能將兩個陣列的不同類型(T1,T2 - > T,T)的和必須使用方法名。你應該調用該方法,如:

ArrayItems<TypeName>(TypeName a, TypeName b); 
+0

爲什麼你明確指定泛型類型參數? – 2009-08-19 15:29:37

6

數組是這樣2004年

public IEnumerable<string> ArrayItms(IEnumerable<string> a, IEnumerable<string> b) 
{ 
    return a.Concat(b); 
} 

你可以通過你的陣列直接這個功能,因爲數組實現IEnumerable。如果您確實需要數組結果,請在調用該函數後調用.ToArray()。或者,因爲它只是一個單線程,完全跳過該函數,只需在第一個數組上調用.Concat()即可。

請注意,這是很容易轉換爲一個通用的函數,將與任何類型的工作。但是到目前爲止,你只說過你關心字符串。

+0

最佳解決方案。 +1 – 2009-08-19 15:30:08

1

如果兩個數組都是完全相同的類型,你可以使用:

public static T[] Concatenate<T>(T[] a, T[] b) 
{ 
    if (a == null) throw new ArgumentNullException("a"); 
    if (b == null) throw new ArgumentNullException("b"); 

    T[] result = new T[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

否則

public static TResult[] Concatenate<TResult, T1, T2>(T1[] a, T2[] b) 
    where T1 : TResult where T2 : TResult 
{ 
    if (a == null) throw new ArgumentNullException("a"); 
    if (b == null) throw new ArgumentNullException("b"); 

    TResult[] result = new TResult[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

應該做的。

編輯: 也許Array.Copy()不是快,所以它可以對LINQ的CONCAT進行基準測試,或者一個強類型版本可以定製。

+0

現在編輯我的帖子回答問題,請刪除downvote。 – 2009-08-19 15:34:24

+0

沒有看到您的答案。我刪除了最小。我只是補充一下: 它可以工作,因爲數組是C#版本1以後的運行時的協變量。編譯時安全性由通用約束保證。 – thinkbeforecoding 2009-08-19 15:49:18