Я считаю, что это все законно .NET 1.1:
public static object[] Merge(object[] first, object[] second) {
if (first == null) {
throw new ArgumentNullException("first");
}
if (second == null) {
throw new ArgumentNullException("second");
}
Type firstType = first.GetType();
Type secondType = second.GetType();
if (firstType != secondType) {
throw new InvalidOperationException("type mismatch");
}
Hashtable table = new Hashtable();
ArrayList items = new ArrayList();
NewMethod(first, table, items);
NewMethod(second, table, items);
return (object[])items.ToArray(firstType.GetElementType());
}
static void NewMethod(object[] array, Hashtable table, ArrayList items) {
for (int i = 0; i < array.Length; i++) {
object item = array[i];
if (!table.Contains(item)) {
table.Add(item, 1);
items.Add(item);
}
}
}
Мне лень найти подходящее имя для NewMethod
, поэтому я просто позволю Visual Studio присвоить ему имя по умолчанию после процедуры извлечения в метод.
Использование:
object[] a = new string[10];
object[] b = new string[10];
for(int i = 0; i < 10; i++) {
a[i] = i.ToString();
b[i] = (i + 5).ToString();
}
object[] c = Merge(a, b);
Console.WriteLine(c.Length);
Console.WriteLine(c.GetType());
for (int i = 0; i < c.Length; i++) {
Console.WriteLine(c[i]);
}
Выход:
15
System.String[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Обратите внимание, что если вы хотите поместить массив из двух T[]
, где T : ValueType
в Merge
, вы должны сначала упаковать элементы и ввести массив как object[]
; это потому, что нет преобразования T[]
в object[]
при T : ValueType
. Более того, поскольку GetType
не является виртуальным, лучшее, что вы можете получить в этом случае, это object[]
, а не T[]
.