2014-09-18 2 views
0

내 솔루션에서는 XML 파일의 XElement을 다른 파일로 복사하는 Copy()과 함께 Object Class을 가지고 있습니다.정적 변수를 피할 수있는 솔루션

이제 Copy()을 호출하기 위해 Objects을 현재 XElement 내에 보내야하므로 재귀 호출을합니다. 이 과정에서 업데이트 될 attributevalue을 추출합니다.

이제이 작업을 수행 한 유일한 방법은 static variable에 이러한 값을 모두 추출하여 Object의 새 인스턴스가 생성 될 때마다 변경되지 않는 것입니다.

그래서, 기본적으로 내가 가진 :

public class Item 
{ 
    public XElement Element; 

    private static readonly List<Tuple<string, string>> Ids = new List<Tuple<string, string>>(); 

    public String Copy(){ 

     //Recursively get all the OldIds from the current Element 

     //populate the List with oldIds and "" 

     //generate newId for this 

     //update List that matches the OldId and put the newId 

     //Update the Element 

     //Transfer Element 

     return newId;  
    } 
} 

가 무엇 static List을 사용하지 않도록하는 가장 좋은 방법이 있을까요?

감사합니다.

+1

: 그런 다음 하위 요소의 전체 트리를 얻을 수 있도록 요소 메소드를 호출 할 수 있습니다

public static IEnumerable<T> Traverse<T>( this IEnumerable<T> source , Func<T, IEnumerable<T>> childrenSelector) { var stack = new Stack<T>(source); while (stack.Any()) { var next = stack.Pop(); yield return next; foreach (var child in childrenSelector(next)) stack.Push(child); } } 

: 여기

는 트리를 탐색하는 간단한 방법입니다 글로벌 변수 **가 오도 될 수 있습니다. C++에서 전역 변수는 클래스에 없으며 C#에서는 전역 변수가 허용되지 않습니다. ** 정적 ** 변수를 호출하기 만하면됩니다. –

답변

2

하나의 해결책은 방법을 재귀 적이 지 않고 반복적으로 만드는 것이다. 범용 트리 탐색 방법을 작성하여 XML 트리를 탐색 한 다음 사용자가 가지고있는 요소에서 호출하여 메소드 호출간에 공유되는 상태없이 목록을 채울 수 있습니다. ** 그것을 호출

XElement element = GetElement(); 
var tree = new[] { element }.Traverse(e => e.Elements()); 
+0

좋은 소리. 그러나 결국에는 해당 항목을 전송하려고합니다. 그래서 나는 그들을 위해 다시 사본을 부르고있다. –

+0

@LuisLavieri 그런 다음 재귀를 사용하는 대신 루프의 모든 항목을 전송하십시오. 간단한 'foreach'를 사용하면 각 항목에 대한 코드를 실행할 수 있습니다. – Servy

+0

예. 나는 이렇게 가정한다 :) 감사 –

1

목록을 인수로 받아들이는 Copy 메서드를 오버로드하십시오.

public String Copy(List<Tuple<string, string>> Ids) {} 

public String Copy() {} 
+0

오버로드 이외에도 선택적 인수를 고려했습니다. 감사합니다 –

관련 문제