2009-06-20 38 views
20

Sáng nay tôi vô tình nhìn thấy đoạn mã sau, tôi khá ngạc nhiên vì nó hoạt động rất tốt.Tại sao chuỗi Request.Cookies trả về thay vì đối tượng HttpCookie trong vòng lặp foreach?

Đừng nhìn vào logic của nó xin vui lòng, tôi chỉ tò mò tại sao HttpCookieCollection (Request.Cookies trong trường hợp này) trả về một chuỗi (tên cookie) thay vì một đối tượng HttpCookie trong vòng lặp foreach. Có một vấn đề nhất quán bởi vì chúng ta thường nhận được đối tượng HttpCookie trong bộ sưu tập này bằng chỉ mục/tên?

Cảm ơn,

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

Cảm ơn bạn, @ Chris: Tôi không hỏi làm thế nào để lặp một bộ sưu tập của vòng lặp for;) –

+0

tôi có cùng một vấn đề, tôi không hiểu tại sao tôi phải sử dụng chuỗi insted của HttpCookie trong tuyên bố foreach. bất kỳ đầu mối? – gonxalo

+1

nếu sử dụng System.Net.CookieCollection bạn có thể lặp lại theo cách đó. nhưng không phải với HttpCookieCollection, hành vi kỳ lạ tôi nghĩ. công khai tĩnh HttpCookieCollection CookieCollectionToHttpCookieCollection (CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = new HttpCookieCollection(); foreach (Cookie cookie trong cookieCollection) { httpCookieCollection.Add (CookieToHttpCookie (cookie)); } trả lại httpCookieCollection; } – gonxalo

Trả lời

6

Nó làm cho ý nghĩa hơn để lặp qua một bộ sưu tập của các phím. Bằng cách đó bạn có thể sử dụng cả các phím và có thể dễ dàng truy cập vào các giá trị bằng cách gọi System.Web.HttpContext.Current.Request.Cookies[cookieKey];

+9

Không nếu bạn có hai cookie có cùng tên trong trường hợp cách tiếp cận này thiếu sót. –

8

Bạn có thể muốn để lặp qua các tập tin cookie của bạn bằng cách chỉ số:

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

Vì bạn có thể nhận được các tập tin cookie của chỉ số số của họ như nó thực sự có thể quét nhiều cookie với cùng tên mà không cần phải sao chép vào CookieCollection hoặc một cái gì đó như thế.

này nên làm như lừa:

var cookieName = "yourcookie"; 
var matches = cookies.AllKeys 
    .Select((name, i) => new {name, i}) 
    .Where(x => x.name == cookieName) 
    .Select(x => DoSomethingWithEachMatch(cookies[x.i])); 
Các vấn đề liên quan