2009-06-20 99 views
20

今天早上我不小心看到下面的代碼片段,我很驚訝,因爲它工作得很好。爲什麼Request.Cookie在foreach循環中返回字符串而不是HttpCookie對象?

請不要看它的邏輯,我只是​​好奇爲什麼HttpCookieCollection(在這種情況下Request.Cookies)返回一個字符串(cookie名稱),而不是在foreach循環中的HttpCookie對象。這是否是一致性問題,因爲我們通常通過索引/名稱在此集合中獲取HttpCookie對象?

感謝,

foreach (string cookieKey in System.Web.HttpContext.Current.Request.Cookies) 
{ 
    HttpCookie tmpCookie = System.Web.HttpContext.Current.Request.Cookies[cookieKey]; 
    if (tmpCookie != null && tmpCookie["RecentlyVisited"] != null) 
    { 
     cookie.Add(tmpCookie); 
    } 
} 
+0

謝謝 @克里斯:我不問如何通過循環遍歷集合;) – 2009-06-22 02:49:51

+0

我有同樣的問題,我不明白爲什麼我必須在foreach聲明中使用HttpCookie的字符串。任何線索? – gonxalo 2009-09-18 20:41:55

回答

6

它更有意義通過按鍵集合進行迭代。這樣,你可以訪問兩個按鍵,可以很容易地通過調用System.Web.HttpContext.Current.Request.Cookies[cookieKey];

8

訪問值,您可以通過索引通過你的餅乾要循環:

HttpCookieCollection MyCookieColl; 
HttpCookie MyCookie; 

MyCookieColl = Request.Cookies; 

// Capture all cookie names into a string array. 
String[] arr1 = MyCookieColl.AllKeys; 

// Grab individual cookie objects by cookie name. 
for (int i = 0; i < arr1.Length; i++) 
{ 
    MyCookie = MyCookieColl[arr1[i]]; 
    Debug.WriteLine("Cookie: " + MyCookie.Name); 
    Debug.WriteLine("Expires: " + MyCookie.Expires); 
    Debug.WriteLine("Secure:" + MyCookie.Secure); 
} 
4

既然你可以通過它們的數值指數得到餅乾以及它實際上可以掃描多個具有相同名稱的cookie,而不必複製到CookieCollection或類似的東西。

這應該做的伎倆:

var cookieName = "yourcookie"; 
var matches = cookies.AllKeys 
    .Select((name, i) => new {name, i}) 
    .Where(x => x.name == cookieName) 
    .Select(x => DoSomethingWithEachMatch(cookies[x.i])); 
相關問題