0

HTMLアジリティパックで取得した4つのテーブルのLINQ結果セットを操作しようとしています。それぞれに変数を設定して (以下の switch ステートメント)、テーブル内の行を処理することで、それぞれを少しずつ処理したいと思います。変数は、理想的には、セット内の各テーブルのインデックスであり03switch ステートメントで使用され、行を選択します。index プロパティを見つけることはできませんでしたが、SelectChildNode.

私の質問は、インデックスで LINQ 結果セット内の項目を参照できますか? 私の「理想的なシナリオ」は、最後にコメントアウトされた行です。前もって感謝します。

var ratingsChgs = from table in htmlDoc.DocumentNode
                  .SelectNodes("//table[@class='calendar-table']")
                  .Cast<HtmlNode>()
                  select table;    
String rtgChgType;

for (int ratingsChgTbl = 0; ratingsChgTbl < 4; ratingsChgTbl++)
{
    switch (ratingsChgTbl)
    {
        case 0:
            rtgChgType = "Upgrades";
            break;
        case 1:
            rtgChgType = "Downgrades";
            break;
        case 2:
            rtgChgType = "Coverage Initiated";
            break;
        case 3:
            rtgChgType = "Coverage Reit/ Price Tgt Changed";
            break;

    //This is what I'd like to do.
    var tblRowsByChgType = from row in ratingsChgs[ratingsChgTbl]
                           .SelectNodes("tr")
                           select row;
    //Processing of returned rows.
    }
}
4

1 に答える 1

2

ElementAtは、あなたが求めていることを行います。ただし、呼び出すたびに最初の LINQ クエリが実行されるため、例で使用することはお勧めしません。簡単な修正は、ratingChgs をリストまたは配列にすることです。

switch ステートメントをリファクタリングすることもできます。アイテムのリストを反復するだけでよい場合は、やり過ぎです。考えられる解決策は次のとおりです。

var ratingsChgs = from table in htmlDoc.DocumentNode
                  .SelectNodes("//table[@class='calendar-table']")
                  .Cast<HtmlNode>()
                  select table;
var rtgChgTypeNames = new List
                      {
                          "Upgrades",
                          "Downgrades",
                          "Coverage Initiated",
                          "Coverage Reit/ Price Tgt Changed"
                      };
var changeTypes = ratingsChgs.Zip(rtgChgTypeNames, (changeType, name) => new 
                                  { 
                                      Name = name,
                                      Rows = changeType.SelectNodes("tr")
                                  });
foreach( var changeType in changeTypes)
{
    var name = changeType.Name;
    var rows = changeType.Rows;
    //Processing of returned rows.
}

また、評価の変更タイプを HTML ドキュメントに保存してみませんか? ビジネス ロジックでテーブル情報を定義するのは奇妙に思えます。

于 2012-05-21T03:48:38.360 に答える