2009-06-02 4 views
0

다음을 저장 /로드하는 좋은 방법을 찾고 있습니다. XML로 저장하고 이상적으로 LiNQ를 사용하려고합니다. 즉, LINQ를 배우는 데 도움이됩니다.XML에 중첩 된 LiNQ

중첩 된 linq 쓰기 방법을 모르겠습니다. 누구든지 도와 줄 수 있습니까?

/// <summary> 
/// 
/// </summary> 
public class ErrorType 
{ 
    List<ErrorType> _childErrors; 

    public String Name { get; set; } 
    public bool Ignore { get; set; } 

    public List<ErrorType> ChildErrors { get; protected set; } 
} 

/// <summary> 
/// 
/// </summary> 
public class ErrorList 
{ 
    public List<ErrorType> ChildErrors { get; protected set; } 

    public void Save() 
    { 
    } 

    public void Load() 
    { 
    } 
} 

기본적으로 ErrorList에는 최상위 수준의 오류 목록이 포함되어 있으며 각 오류에는 하위 항목이있을 수 있습니다. 누군가가 그 좋은 것입니다 도움이 될 수 있다면

<ErrorList> 
<ErrorName1 Ignore="false"> 
<ChildErrorName1 Ignore="true"> 
<ChildErrorName2 Ignore="false" /> 
</ChildErrorName1> 
</ErrorName1> 
<ErrorList> 

: XML 출력은 같은 것을 보일 것입니다. 감사합니다.

답변

1

좋아, 네가 지금 무엇을하고 있는지 알 것 같아. 이 시도 :

// Need to declare in advance to call within the lambda. 
Func<ErrorType, XElement> recursiveGenerator = null; 
recursiveGenerator = error => new XElement 
    (error.Name, 
    new XAttribute("Ignore", error.Ignore), 
    error.ChildErrors.Select(recursiveGenerator)); 

var errorList = new XElement 
    ("ErrorList", errors.ChildErrors.Select(recursiveGenerator)); 

다음은 완전한 예입니다 :에 대한 권리 보이는

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

public class ErrorType 
{ 
    public String Name { get; set; } 
    public bool Ignore { get; set; } 

    public List<ErrorType> ChildErrors { get; protected set; } 
    public ErrorType() 
    { 
     ChildErrors = new List<ErrorType>(); 
    } 
} 

public class ErrorList 
{ 
    public List<ErrorType> ChildErrors { get; protected set; } 
    public ErrorList() 
    { 
     ChildErrors = new List<ErrorType>(); 
    } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     var childError2 = new ErrorType { 
      Name = "ChildErrorName2", Ignore=false }; 
     var childError1 = new ErrorType { 
      Name = "ChildErrorName1", Ignore=true, 
      ChildErrors = { childError2 } 
     }; 
     var mainError = new ErrorType { 
      Name = "ErrorName1", Ignore=true, 
      ChildErrors = { childError1 } 
     }; 
     var errorList = new ErrorList { ChildErrors = { mainError } }; 

     // Need to declare in advance to call within the lambda. 
     Func<ErrorType, XElement> recursiveGenerator = null; 
     recursiveGenerator = error => new XElement 
      (error.Name, 
      new XAttribute("Ignore", error.Ignore), 
      error.ChildErrors.Select(recursiveGenerator)); 

     var element = new XElement 
      ("ErrorList", 
       errorList.ChildErrors.Select(recursiveGenerator); 

     Console.WriteLine(element); 
    }   
} 
+0

건배 존을. 나는 그것을 테스트했지만 그 줄에 컴파일러 오류가있다 : errorList.ChildErrors.Select (recursiveGenerator (x)); X를 errorList.ChildErrors [0]으로 대체하여 올바른 유형을 찾았지만 기쁨은 없었습니다. 내 람다 기술이 약해서 무엇이 잘못되었는지 파악할 수 없었습니다. – Chris

+0

아빠, 고쳐 - 그게 errorList.ChildErrors.Select (recursiveGenerator)이어야합니다; –

+0

(약간은 중복 된 errorList.ChildErrors.Select (x => recursiveGenerator (x))를 사용했습니다.) –

0

this을 살펴보십시오. 그것은 당신이 찾고있는 것이어야합니다. LINQ에 대한 생각은 없지만 XML을 출력하는 데는 오히려 간단하고 쉬운 방법입니다.

결론은 을 사용하는 것입니다.