1

HtmlAgilityPackは趣味のプロジェクトのために Web サイトからデータを取得するために使用します。靴を販売しているサイトから靴の品番を取得したい。

しかし、私の linq クエリは文字列を返しません。代わりに、次のタイプを返します。

System.Linq.Enumerable.WhereSelectEnumerableIterator<HtmlAgilityPack.HtmlNode,string>

単純に文字列を返すクエリを取得するにはどうすればよいですか?

foreach (var node in query)
{
   Shoe shoe = new Shoe();

   var num = from x in node.Descendants()
             where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
             select x.Attributes["title"].Value.Substring(11);

   shoe.articleNumber = Convert.ToInt32(num); //error

   shoes.Add(shoe);
}

エラー: InvalidCastException が処理されませんでした。

タイプ 'WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]' のオブジェクトをタイプ 'System.IConvertible' にキャストできません。

4

3 に答える 3

0

クエリに一致するエントリが 1 つしかないと仮定すると、FirstOrDefault() または First() を使用するように変更する必要があります。

foreach (var node in query)
{
   Shoe shoe = new Shoe();

   var num = (from x in node.Descendants()
         where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
         select x.Attributes["title"].Value.Substring(11)).First();

   shoe.articleNumber = Convert.ToInt32(num);

   shoes.Add(shoe);
}

アイテムが存在しない場合、上記は例外で失敗することに注意してください。

于 2013-09-18T14:06:35.750 に答える
0

クエリは単一の結果ではなく、結果のリストを返します。あなたの場合、これは単一のIDを含むリストになります。これを次のように変更する必要があります。

var num = (from x in node.Descendants()
             where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
             select x.Attributes["title"].Value.Substring(11)).FirstOrDefault();

ここの違いsingle, singleorDefault ,first ,FirstorDefault

于 2013-09-18T14:07:52.547 に答える