2012-10-08 58 views
1

我意識到我無法通過LinkedList.Enumerator替換值。通過LinkedList.Enumerator替換LinkedList元素值

舉例來說,我試圖端口下面的Java代碼到C#:

Java代碼:

ListIterator<Double> itr1 = linkedList1.listIterator(); 
ListIterator<Double> itr2 = linkedList2.listIterator(); 
while(itr1.hasNext() && itr2.hasNext()){ 
    Double d = itr1.next() + itr2.next(); 
    itr1.set(d); 
} 

C#代碼:

LinkedList<Double>.Enumerator itr1 = linkedList1.GetEnumerator();    
LinkedList<Double>.Enumerator itr2 = linkedList2.GetEnumerator(); 

while(itr1.MoveNext() && itr2.MoveNext()){     
    Double d = itr1.Current + itr2.Current; 
    // Opps. Compilation error! 
    itr1.Current = d; 
} 

任何其他技術我可以使用?

回答

5

丙的#LinkedList枚舉枚舉,而不是節點

如果要修改的節點作爲Java版本,我認爲你必須手動「枚舉」的節點:

LinkedListNode<Double> nod1 = linkedList1.First; 
LinkedListNode<Double> nod2 = linkedList2.First; 
while (nod1 != null && nod2 != null) 
{ 
    Double d = nod1.Value + nod2.Value;    
    nod1.Value = d; 
    nod1 = nod1.Next; 
    nod2 = nod2.Next; 
} 
+0

非常好的技巧。謝謝。 –

0

也許是足夠簡單地建立一個新的列表:

linkedList1 = new LinkedList<double> (linkedList1.Zip(linkedList2, (first, second) => first + second)); 

如果您需要原始列表被改變,你可能想要做

var tmp = linkedList1.Zip(linkedList2, (first, second) => first + second).ToList(); 
linkedList1.Clear(); 
linkedList1.AddRange (tmp); 
+0

'linkedList1'是LinkedList的'',所以你不能用' .ToList();''''''''''''''''''''''''''''''''''''''你需要的東西類似於:'linkedList1 = new LinkedList (linkedList1.Zip(linkedList2,(first,second)=> first + second));' –

+0

爲什麼我不能使用ToList ()'爲'列表'????我只是試過了,我沒有看到任何問題。它做它應該做的事情。 – JohnB

+0

因爲它不是'List <>',所以它是一個['LinkedList <>'](http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx) –