2009-06-20 12 views
20

今朝私は誤って次のスニペットコードを見ましたが、とてもうまく機能していたのでかなり驚いていました。なぜRequest.CookiesはforeachループでHttpCookieオブジェクトの代わりにstringを返しますか?

私は、HttpCookieCollection(この場合はRequest.Cookies)がforeachループ内のHttpCookieオブジェクトの代わりに文字列(Cookie名)を返すのはなぜか不思議です。このコレクション内で通常HttpCookieオブジェクトをindex/nameで取得するため、一貫性の問題ですか?

おかげで、

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

は、 @クリスありがとうございます::これはトリックを行う必要があります

私は、forループでコレクションを反復処理する方法を尋ねていないが、) –

+0

私は同じ問題を持って、私は理解していませんなぜforeach宣言でHttpCookieの文字列instedを使用しなければならないのですか?どんな手掛かり? – gonxalo

+1

System.Net.CookieCollectionを使用している場合、そのように反復することができます。 HttpCookieCollectionでは、奇妙な振る舞いとは思えません。 パブリックスタティックHttpCookieCollection CookieCollectionToHttpCookieCollection(CookieCollection cookieCollection) { HttpCookieCollection httpCookieCollection = new HttpCookieCollection(); foreach(cookieCollectionのCookie Cookie) { httpCookieCollection.Add(CookieToHttpCookie(cookie)); } return httpCookieCollection; } – gonxalo

答えて

6

それはキーでコレクションを反復処理する方が理にかなっています。そのようにあなたは、インデックスによって、あなたのクッキーをループする場合がありますキーの両方へのアクセス権を持っているし、簡単にSystem.Web.HttpContext.Current.Request.Cookies[cookieKey];

+9

同じ名前のCookieが2つある場合は、この方法に問題があります。 –

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

あなたは、それらの数値インデックスでクッキーを取得することができますので、 CookieCollectionなどにコピーすることなく、同じ名前の複数のCookieをスキャンすることは実際可能です。

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