2012-10-08 41 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) –