.net 如何将Cookies集合转换为通用列表?轻易地

.net 如何将Cookies集合转换为通用列表?轻易地,.net,generics,.net-3.5,.net,Generics,.net 3.5,有人知道我如何将Request.Cookies转换为列表?以下操作不起作用,因为它引发了异常 List<HttpCookie> lstCookies = new List<HttpCookie>( Request.Cookies.Cast<HttpCookie>()); List=新列表( Request.Cookies.Cast()); 异常:无法将类型为“System.String”的对象强制转换为类型为“System.Web.HttpCook

有人知道我如何将
Request.Cookies
转换为
列表
?以下操作不起作用,因为它引发了异常

List<HttpCookie> lstCookies = new List<HttpCookie>(
    Request.Cookies.Cast<HttpCookie>());
List=新列表(
Request.Cookies.Cast());
异常:无法将类型为“System.String”的对象强制转换为类型为“System.Web.HttpCookie”

.Cookies.cast()尝试将密钥集合强制转换为cookie集合。因此,出现错误是很正常的:)

这是一个名称->值集合,因此将其转换为列表并不好

我会试着把它转换成字典

例如:

Dictionary cookieCollection = new Dictionary<string, object>();

foreach(var key in Request.Cookies.GetAllKeys())
{
    cookieCollection.Add(key, Request.Cookies.Item[key]);
}
由于Cookie继承自NameObjectCollectionBase,因此您可以使用该列表获取所有值并将其放入字典中

例如:

Dictionary cookieCollection = new Dictionary<string, object>();

foreach(var key in Request.Cookies.GetAllKeys())
{
    cookieCollection.Add(key, Request.Cookies.Item[key]);
}
Dictionary-cookieCollection=new Dictionary();
foreach(请求中的var key.Cookies.GetAllKeys())
{
添加(key,Request.Cookies.Item[key]);
}

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

public virtual IEnumerator GetEnumerator()
{
    return new NameObjectKeysEnumerator(this);
}
这意味着以下各项将起作用:

string[] keys = Request.Cookies.Cast<string>().ToArray();
List<HttpCookie> lstCookies = Request.Cookies.Keys.Cast<string>()
    .Select(x => Request.Cookies[x]).ToList();

如果您确实想要一个没有键->值连接的直接
列表
,那么您可以使用LINQ中的Select:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();

这个问题可能有点老了,但这里的答案并没有涵盖所有情况,因为正如@C.M.所指出的,可能有多个cookie具有相同的名称

因此,最简单的方法是使用for循环循环cookies集合:

var existingCookies = new List<HttpCookie>();

for (var i = 0; i < _httpContext.Request.Cookies.Count; i++)
{
    existingCookies.Add(_httpContext.Request.Cookies[i]);
}
var existingCookies=new List();
对于(var i=0;i<\u httpContext.Request.Cookies.Count;i++)
{
existingCookies.Add(_httpContext.Request.Cookies[i]);
}

但随后您会丢失键->值连接:)@Snake,我同意您的观点,从性能角度来看,这不是最佳的,因为它会多次枚举集合,但如果您有几个元素,则可能不会太夸张。使用HttpCookieCollection的AllKeys成员可以保存强制转换。代码见我的答案。这帮助我解决了XmlSerializer序列化键而不是值的问题。My NameObjectCollectionBase子类需要重写GetEnumerator,因为
返回此.BaseGetValues().GetEnumerator()IE可以发送具有相同名称的多个Cookie。如果发生这种情况,则上面的代码将丢失其中一个cookie。该代码仅获取具有相同名称的第一个cookie。