2012-03-19 8 views
0

さまざまな注文書類をプリントアウトしようとしています。今、私は印刷オブジェクトのコレクションと、各ノードがコレクションの印刷オブジェクトに関連付けられた属性を持つXML文書を持っています。これらの属性に基づいてXML文書をソートすることによって、これらのオブジェクトをソートしたいと思います。XMLソートオプションC#.Net

今、私はサイクリングしている一連のコレクションを使用しています。これは、必要な並べ替えに基づいてノードを新しいコレクションに追加しています。問題は、3つまたは4つの種類が乱雑になることです。 XMLを使用するかどうかで、このコレクションの印刷オブジェクトをソートするには、より良い方法が必要であると確信しています。

  • 誰でもドキュメント

の文書

  • 名に記載されているページ
  • 郵便番号の#を持っています。ここでは

    は私のXMLは、私が上の並べ替えていますことを持っているいくつかの属性があります良いアイデア?

    おかげで、

    EDIT -

    私の文書は、キー値が印刷オブジェクトコレクションのスポットに関連付けられている

    <xml> 
    <claim key="1" att1="wd" att2="de"/> 
    <claim key="2" att1="wd" att2="de"/> 
    <claim key="3" att1="wd" att2="de"/> 
    <claim key="4" att1="wd" att2="de"/> 
    </xml> 
    

    ようになります。クレームノードには、より多くの子ノードがあるかもしれませんが、私はそれがこの時点では関連していないと思います。私はちょうど属性に基づいて並べ替えることができるようになりたいですが、少なくとも3つの属性がありますが、それ以上の属性が追加されることがあります。また、これは多用途にする必要があります。ソート順を切り替える必要がある場合は、並べ替えがやや簡単です。 XMLを正しい順序で取得したら、キーをリストに入れ、そのリストのキーでPrintオブジェクトを印刷するために、XMLを通してサイクルを使います。

    おかげで、

  • +0

    は、ドキュメントの例を投稿することができますが、印刷対象にXMLノードをリンクされていますか、お願いします?それは大いに役立つだろう。 – deadlyvices

    +2

    私はいくつかのグループ化と並べ替えであなたを助ける少しLINQを提案するつもりですが、具体的な例を与えるためにXMLの外観を見なければならないでしょう。 [ここに投稿があります](http://stackoverflow.com/questions/5013710/linq-order-by-group-by-and-order-by-each-group) 。 –

    答えて

    1

    私はLINQPadでこの例を試し、あなたが求めているものを行うようです。

    var root = XDocument.Parse("<xml><claim>...</claim></xml>").Element("xml"); 
    
    var query = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select claim; 
    

    それは、あなたのXMLで<claim>ノードを見つけ、あなたが並べ替えしたいどの属性を選択し、それらをソートして、ソート<claim>ノードを表すIEnumerable<XElement>コレクションを返します。

    あなたは、あなたのPrintオブジェクトを構築するために、またはあなたはそれがあなたのためにそれを行う持っている以上を変更することができquery結果を使用することができます。

    var query2 = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select new Print { 
             Property1 = key, // do type conversion if needed 
             Property2 = att1, 
             Property3 = att2 
            }; 
    

    私はそれはあなたが言及した保守性の要件に合うと思います - あなたは別のソートが必要な場合は、LINQクエリの属性名の追加/削除/変更を変更するだけです。

    編集:以下のコメントどおり、int秒のリストにキーを取得するには、次の

    var printKeys = (from claim in query 
           select Integer.Parse(claim.Attributes("key").First().Value)).ToList(); 
    
    +0

    これは、私が必要とするところでうまくいくようですが、私の唯一の疑問は、C#に若干新しかったので、IEnumerable コレクションをどのようにループして、Key値をintのリストに入れることができるかです。私はキーでは注文しませんが、キーを押すだけで、print objコレクションのどの場所を印刷するかを知ることができます。 – kds6253

    +0

    @ kds6253:答えを更新しました。 –

    +0

    ありがとう、私は今それを使って作業しています。 XDocumentと使用したソルーションについて、お勧めの読書がありますか?私はそれをさらに読んでみたいと思います。このソリューションは100倍簡単ですが、もともと思いつきましたが、このタイプのソリューションをどこで使うことができるかを知りたいと思います。 – kds6253

    関連する問題