1

Set-Cookieで取得したCookieから番号情報を取得しようとして&om=-&lv=1341532178340&xrs=いますここに番号が必要です

これは私が思いついたものです:

 string key = "";
        ArrayList list = new ArrayList();
        foreach (Cookie cookieValue in agent.LastResponse.Cookies)
        {
            list.Add(cookieValue);

        }
        String[] myArr = (String[])list.ToArray(typeof(string));
        foreach (string i in myArr)
        {

            // Here we call Regex.Match.
            Match match = Regex.Match(i, @"&lv=(.*)&xrs=",
                RegexOptions.IgnoreCase);

            // Here we check the Match instance.
            if (match.Success)
            {
                // Finally, we get the Group value and display it.
                 key = match.Groups[1].Value;
            }
        }

 agent.GetURL("http://site.com/" + key + ".php");

私が抱えている問題は、ArrayListをStringに変更できないことです(エラーは、「ソース配列の少なくとも1つの要素を宛先配列タイプにキャストできませんでした」です)。それを修正する方法またはそれを行うためのより良いコードを思い付くことができますか?

どうもありがとう!

4

1 に答える 1

3

最初のループでは、インスタンスArrayListを含むを構築しています。2 番目のループの直前に行おうとしているように、単純に からにCookie変換することはできません。Cookiestring

すべての Cookie の値を取得する簡単な方法は、LINQ を使用することです。

IEnumerable<string> cookieValues = agent.LastResponse.Cookies.Select(x => x.Value);

まだ .NET Framework 2.0 を使用している場合は、ループを使用する必要があります。

List<string> cookieValues = new List<string>();
foreach (Cookie cookie in agent.LastResponse.Cookies)
{
    cookieValues.Add(cookie.Value);
}

次に、以前と同じように、このコレクションを反復処理できます。ただし、複数の Cookie が正規表現に一致する場合、最後に一致した Cookie がkey? 一致する複数の Cookie がある場合、これがどのように機能するか正確にはわかりませんが、最初の Cookie が必要な場合は、LINQ を再び使用してコードを単純化し、1 つのクエリで必要なほとんどすべてを実行できます。

var cookies = agent.LastResponse.Cookies;
string key = cookies.Cast<Cookie>()
    .Select(x => Regex.Match(x.Value, @"&lv=(.*)&xrs=", RegexOptions.IgnoreCase))
    .Where(x => x.Success)
    .Select(x => x.Groups[1].Value)
    .FirstOrDefault();

一致がなかった場合はkeynull になり、それ以外の場合は最初の一致が含まれます。このCast<Cookie>()ビットは、型推論を開始するために必要です。実装されていないagent.LastResponse.Cookiesインスタンスを返すと思います。CookieCollectionIEnumerable<Cookie>

于 2012-07-07T20:52:01.553 に答える