2017-06-06 24 views
0

我不確定是否有正確的術語,但會盡力描述我可以!在C#中重新分配一個變量指向另一個變量的過程是什麼?

目前我已在一個for循環內執行以下操作:

NewArray.Add(RawDataArray[i].Value); 

在處理期間RawDataArray一些額外的陣列的將被創建的過程中,例如NewArray1,NewArray2等

在一個點我需要NewArray指向NewArray1,以便.Add方法將數據添加到NewArray1和在另一個點,我需要指向NewArray到另一個NewArray X

如何在C#中執行此操作?

編輯: 爲了試圖澄清這裏,我希望相關部分:

List<object> NewArray = new List<object>(); 

      for (int i = 1; i <= RawDataArray.Count; i++) 
      { 
       if (RawDataArray[i].TypeCode == 5005) 
       { 
        NewArray.Add(RawDataArray[i].Value); 
       } 

       if (RawDataArray[i].TypeCode == 5016) 
       { 
        //RawDataArray[i] should be added to NewArray1 
        >> Create NewArray1 and "change" NewArray so that it points to NewArray1 << 
        NewArray.Add(RawDataArray[i].Value); 
       } 

       if (RawDataArray[i].TypeCode == 5017) 
       { 
        //RawDataArray[i] should be added to NewArray2 
        >> Create NewArray2 and "change" NewArray so that it points to NewArray2 << 
        NewArray.Add(RawDataArray[i].Value); 
       } 
      } 

希望這是更清晰一點:)

附加編輯:

好,所以我沒有解釋得太好,所以我想還是需要更多的信息,這樣你才能看到完整的圖片。 我有一個原始數據流,在這種情況下,由RawDataArray模擬(OK的'數組'的術語不正確,接受!!)。

struct TypedValue 
     { 
      private readonly int typeCode; 
      private readonly object value; 

      public TypedValue(int typeCode, object value) 
      { 
       this.typeCode = typeCode; 
       this.value = value; 
      } 

      public int TypeCode { get { return typeCode; } } 
      public object Value { get { return value; } } 

     } 

     static readonly IList<TypedValue> RawDataArray = new ReadOnlyCollection<TypedValue> 
     (new[] { 
      new TypedValue(5005,@"String Value 1"), 
      new TypedValue(5005,@"String Value 2"), 
      new TypedValue(5016,@"-1"), 
      new TypedValue(5005,@"String Value 3"), 
      new TypedValue(5005,@"String Value 4"), 
      new TypedValue(5005,@"String Value 5"), 
      new TypedValue(5005,@"String Value 6"), 
      new TypedValue(5005,@"String Value 7"), 
      new TypedValue(5017,@"-1"), 
      new TypedValue(5016,@"-1"), 
      new TypedValue(5005,@"String Value 8"), 
      new TypedValue(5005,@"String Value 9"), 
      new TypedValue(5005,@"String Value 10"), 
      new TypedValue(5005,@"String Value 11"), 
      new TypedValue(5005,@"String Value 12"), 
      new TypedValue(5005,@"String Value 13"), 
      new TypedValue(5005,@"String Value 14"), 
      new TypedValue(5005,@"String Value 15"), 
      new TypedValue(5005,@"String Value 16"), 
      new TypedValue(5005,@"String Value 17"), 
      new TypedValue(5005,@"String Value 18"), 
      new TypedValue(5005,@"String Value 19"), 
      new TypedValue(5017,@"-1"), 
      new TypedValue(5016,@"-1"), 
      new TypedValue(5005,@"String Value 20"), 
      new TypedValue(5005,@"String Value 21"), 
      new TypedValue(5005,@"String Value 22"), 
      new TypedValue(5005,@"String Value 23"), 
      new TypedValue(5005,@"String Value 24"), 
      new TypedValue(5017,@"-1"), 
      new TypedValue(5005,@"String Value 25"), 
      new TypedValue(5016,@"-1"), 
      new TypedValue(5005,@"String Value 26"), 
      new TypedValue(5005,@"String Value 27"), 
      new TypedValue(5005,@"String Value 28"), 
      new TypedValue(5005,@"String Value 29"), 
      new TypedValue(5005,@"String Value 30"), 
      new TypedValue(5017,@"-1"), 
     }); 

混亂的部分是,5016和5017分別形成的數據塊的開始和結束typeCode。也就是說,這些typeCodes之間的數據需要進入一個臨時數組(或其他東西),然後插入到NewArray中。

所以,在僞代碼中,我有這樣的工作思路:

1)(INT I = 1;我< = RawDataArray.Count;我++)

2)如果i.typeCode = 5005然後將i.value添加到NewArray

3)如果i.typeCode = 5016,則創建一個臨時數組並使NewArray指向它,以便對Add方法的調用現在添加到臨時數組中。 4)如果i.typeCode = 5017,則將臨時數組添加到NewArray並將NewArray變量添加到NewArray。

 List<object> NewArray = new List<object>(); 

      for (int i = 1; i <= RawDataArray.Count; i++) 
      { 
       if (RawDataArray[i].TypeCode == 5005) 
       { 
        NewArray.Add(RawDataArray[i].Value); 
       } 

       if (RawDataArray[i].TypeCode == 5016) 
       { 
        //RawDataArray[i] should be added to temporary array 
        //Create temporary array and "change" NewArray so that it points to temporary array 
        NewArray.Add(RawDataArray[i].Value); 
       } 

       if (RawDataArray[i].TypeCode == 5017) 
       { 
        //temporary array should be added to NewArray 
        //Add temporary array to NewArray and re-assign NewArray Variable to reference NewArray so that calls to .Add method add to NewArray 
       } 
      } 

想法是這樣的。當RawDataArray遍歷時,如果遇到5005的typeCode,它會將值添加到NewArray。如果typeCode是5016,它將啓動一個臨時數組並重新分配NewArray變量以指向臨時數組。當下一次遇到5005 typeCode時,NewArray變量指向臨時數組,以便add方法將該值添加到臨時數組中。當找到5017 typeCode時,我們知道臨時數組已完成,需要將其添加到NewArray中,以便此過程完成。 由於NewArray變量現在指向NewArray而不是臨時數組,因此任何後續的.Add調用都將添加到NewArray(因此在5016之外的5005的typeCode和5017數據塊被添加到NewArray。

該圖像還可以幫助http://i.xomf.com/myhln.png

我找到一個像或許有時更好。這似乎是一個簡單的問題,但它是相當困難的話:(

+3

Ummmm'NewArray = NewArray1;'? – itsme86

+0

因此,基本上,你想使用'NewArray'就像一個指針? –

+2

我想這個「數組」,你調用的Add()方法實際上是一個'List ',對吧?如果它是'ArrayList',這已經過時多年了,你應該真的使用'List '來代替。 –

回答

0

您可以克隆的陣列,像這樣來形容:

NewArray = List<YourType>(NewArray1); 

不知道有沒有什麼幫助,好像你有C++背景我不認爲有任何真正的方式來使用它作爲一個指針。

0

指針是非常強大的編程工具,而且也相當危險的。所以,在默認情況下不運行時,您可以處理裸指針。

一Pointe的替代概念rs(以及你需要的那個)是參考。內存中有一個類的實例(Array是一個類)。分配給一個或多個參考。因此,像這樣:

//Create a List of List<int>'s 
List<List<int>> ListOfLists = new List<List<int>>(); 

for (int i=0; i < 10){ 
    List<int> currentList = new List<int>(); 
    ListOfLists.Add(currentList); 
    //Do some work with current list, like filling it with content in a loop. 
} 

//Do the processing or output of ListOfLists 
+0

默認情況下,代碼不是不安全的。所以默認情況下你不能使用裸指針;)我不想指出他怎麼能做到這一點,因爲這樣做只是錯過了使用C#而非本地C++的一半和優點。 – Christopher

0

你澄清你的問題後,我當選爲重新答案(如編輯是澄清現有的答案,而不是一個完全不同的答案)

這是你需要什麼要做:

var results = new List<List<TypedValue>>(); 
var tempList = new List<TypedValue>(); 
foreach (var value in RawDataArray) 
{ 
    if (value.TypeCode == 5016) 
     tempList = new List<TypedValue>(); 

    tempList.Add(value); 

    if (value.TypeCode == 5017) 
     results.Add(tempList); 
} 
相關問題