2012-03-31 1 views
2

myObj에는 example mySubObj라는 개체의 자체 목록이있는 List가 있습니다. mySubObj 객체에는 Name이라는 문자열이 있습니다.클래스의 트리 지향 데이터 구조에 대한 C# LINQ

그래서 mySubObj에서 소품 문자열 Name에 새로운 List base를 생성하려고합니다.

나는이 코드를 작성하지만, 잘못 것으로 보인다 :

var por = msgs.Where(x => x.Parameters 
         .Where(p => p.ParameterName == s).Count() == 1); 

사람이 LINQ 나를 도와 드릴까요?

편집 :

public class L3Message 
{ 
    public int Number { get; set; } 
    public string MessageName { get; set; } 
    public string Device { get; set; } 
    public string Time { get; set; } 
    public string ScramblingCode { get; set; } 

    public List<Parameter> Parameters { get; set; } 

    public L3Message() 
    { 
     Parameters = new List<Parameter>(); 
    }} 

public class Parameter 
{ 
    public int numOfWhitespaces { get; set; } 

    public string ParameterName { get; set; } 
    public string ParameterValue { get; set; } 

    public Parameter Parent { get; set; } 
    public List<Parameter> SubParameters { get; set; } 

    public Parameter() 
    { 
     SubParameters = new List<Parameter>(); 
    } 


} 
+0

일부 매개 변수가있는 메시지의 이름을 x로 지정 하시겠습니까? – aKzenT

+4

어떻게 이것이 틀린 것처럼 보입니까? 너 뭐하려고? 당신은 무엇을 제외하고 무엇을 얻고 있습니까? –

+0

흠. 문제는 발견했으나 해결책은 아니 었습니다. myObj에는 ParameterNames가 있고이 LINQ는 수행 할 작업을 수행합니다.나는 출력 myObj 마녀가 하나만 ParameterName을 정의 mySubObj, 다른 방법은 내가 문자열을 다른 이름으로 모든 subObj 밖으로 역할을 말할 필요가 걸릴 제외하고. 나는 편집 된 질문을 할 것이다. – JohnDoeKazama

답변

1

방법이 더 지정해야합니다 이것으로, 여기에

내 클래스의 두 가지이다 :

foreach (string s in parameters) 
      { 
       using (StreamWriter streamWriter = new StreamWriter(outputFolder + "/" + s + ".xls")) 
       { 
        streamWriter.Write("No.\tMessage\tMS\tTime\tSC"); 

        var por = (from m in msgs 
           from p in m.Parameters 
           where p.ParameterName == s 
           select m).Distinct(); 


        List<string> headeri = new List<string>(); 
        List<string> vrijednosti = new List<string>(); 

        foreach (L3Message p in por) 
        { 
         foreach (Parameter pam in p.Parameters) 
         { 
          TraverseForHeaders(pam, ref headeri); 
         } 
        } 

        foreach (string head in headeri) 
        { 
         streamWriter.Write("\t" + head); 
        } 
        streamWriter.Write("\n"); 

편집 2 : 이것은 전체 코드입니다 나는 당신이 이름으로 지정한 것을 제외한 모든 매개 변수가 제거 된 "트리"를 만들고자하는 순간 그것을 이해합니다. 원본을 변경하고 "잃어버린"매개 변수를 복구 할 수 없기 때문에 메시지의 복사본을 만들어야합니다 (주석에서 말한 것은 일시적이기를 원하기 때문입니다).

그래서이와 코드가 더 많거나 적은이 같은해야한다 :

 var por = (from m in messages 
        from p in m.Parameters 
        where p.ParameterName == s 
        select new L3Message { Number = m.Number, ..., Parameters = new List<Parameter> { p } } 
       ); 

"..."당신이 메시지에서 다른 매개 변수를 복사해야하는 대신.

이 모든 것들이 일시적으로 이러한 속성을 제거하는 것은 여러분이 갖고있는 문제에 대한 나쁜 해결책처럼 보입니다. 이 메서드를 다른 메서드에 전달하려면이 메서드를 변경하여 볼 수있는 속성을 말할 수 있습니까?

편집 :

Edit2가이 고정 코드 (두 번째) : 고정 코드는 다시 (지금의 속성을 복제가 추가 메시지 발생, 또한 내 다른 대답을 참조

+0

이것은 OPs가 매개 변수에 뚜렷한 카운트를 가지고있는 반면, msgs에 대해 뚜렷한 카운트를 실행한다는 점을 제외하고는 거의 똑같습니다. 어쩌면 틀린 것이지만, OP가 OP가하려고하는 것을주지 않기 때문에 그것은 명확한 가정입니다 –

+0

죄송합니다 ... 아직 모든 메시지가 있습니다! – JohnDoeKazama

+0

죄송합니다 명백한 LINQ에 문제가 아니라, L3Message obj ... 그 obj 일부 ParameterNames 및 LINQ messeges 걸릴 내 머리글 확장합니다. – JohnDoeKazama

1

을 나는 이것이 무엇을 믿습니다. 당신은 내가이 아마 하나 LINQ 문으로 세척 할 수 있습니다 알고 있지만, 당신이 먼저 필요 실제로 있는지 테스트 할 수 있습니다. 원하는?

var hasS = msgs.Where(x=>x.Parameters.Where(p=>p.ParameterName == s).Count() > 0); 
var hasOtherThanS = msgs.Where(x=>x.Parameters.Where(p=>p.ParameterName != s).Count() > 0); 
var por = hasS.Except(hasOtherThanS); 
+0

죄송합니다 ... 출력이 매우 혼란 스럽습니다. 나는 지금 내 코드에서 길을 잃어 버렸어. 내일이면 계속 될거야. (도움이 필요해.) 내일 당신이 온라인이 되길 바래. – JohnDoeKazama

0

나 ' 왜냐하면 OP가 더 많은 코드를 추가했기 때문에 문제에 대한 또 다른 해결책이있을 수도 있고 없을 수도 있기 때문입니다.

정말로 메시지에서 매개 변수를 제거해야합니까? 다음과 같이 코드를 변경하지 마십시오.

이렇게하면 메시지는 그대로 유지되지만 나머지 코드는 건너 뛰기 만하면됩니다.

+0

이 코드를 테스트 할게. , 피드백을 제공합니다. – JohnDoeKazama

+0

첫 번째 대답은 효과가있었습니다 !!! 거기에 내 의견을 참조하십시오. – JohnDoeKazama

관련 문제