0

我正在尝试使用通过 html 敏捷包检索到的 4 个表的 LINQ 结果集。我想通过为每个变量设置一个变量(下面的 switch 语句),然后处理表中的行来稍微不同地处理每个变量。理想情况下,该变量将是集合中每个表的索引0to 3,并将在 switch 语句中使用并选择行。我无法找到 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 回答