2012-07-07 24 views
1

我想從一個cookie的數字信息我得到的Set-Cookie我需要&om=-&lv=1341532178340&xrs=這裏的數字的getCookie提取信息爲String

這是我想出了:

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更改爲字符串(錯誤是:「源數組中至少有一個元素不能被轉換爲目標數組類型。」),我以爲你們可以幫我也許你可以想出一種方法來修復它或更好的代碼來做到這一點?

非常感謝!

+0

爲什麼不使用列表而不是ArrayList – HatSoft 2012-07-07 21:28:27

+0

我沒有太多經驗,如果我使用列表會有什麼不同? – MiLady 2012-07-07 22:12:11

回答

3

使用第一個循環,您正在構建一個包含Cookie實例的ArrayList。不可能簡單地將Cookie轉換爲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時如何工作,但如果您只需要第一個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返回CookieCollection的實例,它不會實現IEnumerable<Cookie>

+0

哇這麼多的信息非常感謝你的時間和精力幫助我與這一個! :DI使用此代碼獲得以下錯誤:'錯誤'System.Net.CookieCollection'不包含'Cast'的定義,並且沒有擴展方法'Cast'接受類型爲「System.Net.CookieCollection」的第一個參數'可以找到(你是否遺漏了使用指令或程序集引用?)' – MiLady 2012-07-07 22:14:45

+0

@MiLady'Cast()'和我的示例中使用的所有其他方法都是擴展方法。他們住在命名空間'System.Linq'中,所以你需要在代碼中添加'using System.Linq;'。 – 2012-07-08 06:40:15

+0

啊哈好吧,我加了:)這soultion意味着它只能在.net framework 3.5上運行?我的項目工作2我想這是一個靈魂,但不是框架2權利? – MiLady 2012-07-08 07:01:06