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 (错误是:“源数组中的至少一个元素无法转换为目标数组类型。”),我想你们可以帮助我,也许你们可以想出一种方法来修复它或更好的代码来做到这一点?

非常感谢!

4

1 回答 1

3

在第一个循环中,您正在构建一个ArrayList包含Cookie实例的对象。不可能像您在第二个循环之前尝试做Cookie的那样简单地转换 from 。string

获取所有 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 与您的正则表达式匹配,则匹配的最后一个将存储到key? 当有多个匹配的 cookie 时,不知道您希望它如何工作,但如果您只是想要第一个,您可以再次使用 LINQ 使您的代码更简单,并在一个查询中完成几乎所有您需要的事情:

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();

如果没有匹配,key则为空,否则,它将包含第一个匹配项。该Cast<Cookie>()位对于启动类型推断是必要的 - 我相信它会返回一个未实现agent.LastResponse.Cookies的实例。CookieCollectionIEnumerable<Cookie>

于 2012-07-07T20:52:01.553 回答