如何将Cookies集合转换为通用列表?容易

Nae*_*raz 8 .net generics .net-3.5

谁知道我怎么能Request.Cookies变成一个List<HttpCookie>?以下不起作用,因为它抛出异常.

List<HttpCookie> lstCookies = new List<HttpCookie>(
    Request.Cookies.Cast<HttpCookie>());
Run Code Online (Sandbox Code Playgroud)

例外:无法将"System.String"类型的对象强制转换为"System.Web.HttpCookie"类型

Dar*_*rov 11

发生这种情况的原因是因为派生的NameObjectCollectionBase类型Request.Cookies枚举了集合的键而不是值.因此,当您枚举Request.Cookies集合时,您将获得密钥:

public virtual IEnumerator GetEnumerator()
{
    return new NameObjectKeysEnumerator(this);
}
Run Code Online (Sandbox Code Playgroud)

这意味着以下内容将起作用:

string[] keys = Request.Cookies.Cast<string>().ToArray();
Run Code Online (Sandbox Code Playgroud)

我想你可以尝试以下可能被认为是丑陋但可行的:

List<HttpCookie> lstCookies = Request.Cookies.Keys.Cast<string>()
    .Select(x => Request.Cookies[x]).ToList();
Run Code Online (Sandbox Code Playgroud)

更新:

正如@Jon Benedicto在评论部分和使用该AllKeys属性的回答中所指出的更为优化,因为它节省了一个演员:

List<HttpCookie> lstCookies = Request.Cookies.AllKeys
    .Select(x => Request.Cookies[x]).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 使用HttpCookieCollection的AllKeys成员可保存转换。见我的答案代码。 (2认同)

Jon*_*cto 5

如果你真的想要一个List<HttpCookie>没有key-> value连接的笔直,那么你可以使用LINQ中的Select来做到这一点:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
Run Code Online (Sandbox Code Playgroud)