2012-03-31 9 views
2

myObjにはmySubObjという名前のオブジェクトのリストがあるListがあります。 オブジェクトmySubObjには文字列Nameがあります。クラスのツリー指向データ構造のC#LINQ

だから私は、新しい文字列をベースに新しいリストベースを作成するmySubObjから。

私はこのコードを書いたが、それは間違っているようだ:

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

誰がLINQで私を助けることができますか?

EDIT:

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

Hmm。私は問題を発見しましたが、解決策ではありません、問題はmyObjが両方のParameterNamesを持っていることです、そして、このLINQはそれがするべきことをします。私は出力を取ることを除いてmyObjの魔女はmySubObjを持っていてParameterNameを定義している、別の方法では、文字列sとは異なる名前を持つすべてのsubObjをロールアウトしたい。私は質問を編集します。 – JohnDoeKazama

答えて

1

方法:それはより多くの指定する必要があり、これに、ここで

は私のクラスの2である:

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 } } 
       ); 

の代わりに「...」あなたは、メッセージから他のパラメータをコピーする必要があります。

これらはすべて、一時的にこれらのプロパティを削除することは、あなたの持つ問題の悪い解決策と思われます。これを別のメソッドに渡したい場合は、このメソッドを変更して見た目のプロパティを指定することはできませんか?

編集:固定コード(2回目)

EDIT2:固定コード再び(今も私の代替の回答を参照してください、プロパティが追加メッセージが表示される重複し

+0

これはほぼ同じことですが、あなたはmsgsにはっきりとカウントされますが、OPにはパラメータの個数が異なります。多分それは間違っているものですが、それはOPがOPが何をしようとしているかを与えていないので間違いなく前提です –

+0

申し訳ありません...まだすべてのメッセージがあります! – JohnDoeKazama

+0

申し訳ありませんが明白な問題はLINQではない、それはL3Message objにあります...そのobjの中にはParameterNamesとLINQの両方が含まれています。 – JohnDoeKazama

1

私は、これは何であると信じています私はこれはおそらく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がもう少しコードを追加したので、問題の別の解決方法があるかもしれないし、そうでないかもしれないので、2番目の答えを書いています。

本当にメッセージからパラメータを削除する必要はありますか?

このようにメッセージをそのまま残しておきますが、コードの残りの部分をスキップするだけです。

+0

私はこのコードをテストしますフィードバックしてください。 – JohnDoeKazama

+0

あなたの最初の答えが働いた!そこに私のコメントを見てください。 – JohnDoeKazama