2015-01-12 105 views
1

我希望能夠擁有多個陣列並能夠將它們合併在一起。這個概念很簡單,但我也希望能夠改變其中一個原始數組,並改變合併數組。這個想法是,某種參考系統將被有效地構建,使得合併數組成爲一個指針數組。將多個陣列與參考合併

示例代碼:

 int[] a1 = new int[5]; 
     int[] a2 = new int[5]; 
     for (int i = 0; i < 5; i++) 
     { 
      a1[i] = i; 
      a2[i] = i + 5; 
     } 
     int[] a3; 
     a3 = MergeFunction(a1, a2) 
     Console.WriteLine(a3[0] + ""); 
     a1[0] = 10; 
     Console.WriteLine(a3[0] + ""); 
     Console.ReadKey(); 

這將輸出第一0,然後10

+0

那麼什麼是碼這個問題?你認爲什麼是「合併」? –

回答

0

在我而言,我並不真的想使用整數,但我有這麼示例代碼由另一個類,我會使用任意類,但如果別人想使用int,轉到此頁面並查看值變量的解決方案。 C#: Array of references/pointers to a number of integers

首先,我做了一個非常簡單的變量類

public class Variable 
{ 
    public int a; 
    public int b; 
    public int c; 

    public Variable(int a, int b, int c) 
    { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 
} 

最後,這裏是測試參考想法

 static void Main(string[] args) 
    { 
     //definition of variables 
     Variable[] a1 = new Variable[5]; 
     Variable[] a2 = new Variable[5]; 

     //fill the variables 
     for (int i = 0; i < 5; i++) 
     { 
      a1[i] = new Variable(i, i* 2, i*3); 
      a2[i] = new Variable(i + 5, (i+ 5) * 2, (i+5) * 3); 
     } 

     //define combination 
     Variable[] a3; 

     //join arrays 
     a3 = a1.Union(a2).ToArray(); 

     //inefficient print 
     Console.WriteLine(a3[0].a + ""); 
     //change original array 
     a1[0].a = 10; 
     //inefficient print 
     Console.WriteLine(a3[0].a + ""); 
     Console.ReadKey(); 
    } 

此輸出0,那麼10

0

我覺得有沒有你要找的參考系統。每當對原始數組進行更改時,您都必須進行合併。

1

你可以使用LINQ來解決這個問題。例如,

void Main() 
{ 
    int[] a1 = new int[5]; 
    int[] a2 = new int[5]; 
    for (int i = 0; i < 5; i++) 
    { 
     a1[i] = i; 
     a2[i] = i + 5; 
    } 
    IEnumerable<int> a3; 
    a3 = MergeFunction(a1, a2); 
    Console.WriteLine(a3.ToArray()[0] + ""); 
    a1[0] = 10; 
    Console.WriteLine(a3.ToArray()[0] + ""); 
    Console.ReadKey(); 
} 

public IEnumerable<int> MergeFunction(int[] a1, int[] a2) 
{ 
    return a1.Union(a2); 
} 

由於linq的延遲執行,它也顯示了基本數組的變化。

考慮到這一點,您可以編寫一個小類,使項目訪問的語法類似於項目訪問的數組語法。例如:

void Main() 
{ 
    int[] a1 = new int[5]; 
    int[] a2 = new int[5]; 
    for (int i = 0; i < 5; i++) 
    { 
     a1[i] = i; 
     a2[i] = i + 5; 
    } 
    ArrayMerger<int> a3 = new ArrayMerger<int>(a1,a2); 

    Console.WriteLine(a3[0] + ""); 
    a1[0] = 10; 
    Console.WriteLine(a3[0] + ""); 
    a2[0] = 15; 
    Console.WriteLine(a3[5] + ""); 
} 

public class ArrayMerger<T> 
{ 
    private readonly IEnumerable<T> arrayUnion; 

    public ArrayMerger(T[] array1, T[] array2) 
    { 
     arrayUnion = array1.Union(array2); 
    } 

    public T this[int i] 
    { 
     get 
     { 
      return arrayUnion.ElementAt(i); 
     } 
    } 
}