Как я преобразовываю набор Cookie в универсальный список? Легко

Любой знает, как я могу преобразовать Request.Cookies в a List<HttpCookie>? Следующее не работало, поскольку оно выдает исключение.

List<HttpCookie> lstCookies = new List<HttpCookie>(
    Request.Cookies.Cast<HttpCookie>());

Исключение: Не мог бросить объект типа 'Система. Строка' для ввода 'Системы. Сеть. HttpCookie'

8
задан Naeem Sarfraz 27 May 2010 в 16:14
поделиться

3 ответа

Это происходит потому, что тип NameObjectCollectionBase от которого происходит 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();

UPDATE:

Как указал @Jon Benedicto в разделе комментариев и в его ответе использование свойства AllKeys является более оптимальным, так как сохраняет каст:

List<HttpCookie> lstCookies = Request.Cookies.AllKeys
    .Select(x => Request.Cookies[x]).ToList();
11
ответ дан 5 December 2019 в 08:22
поделиться

.Cookies.Cast (); пытается преобразовать коллекцию ключей в коллекцию файлов cookie. Так что нормально, что вы получаете сообщение об ошибке :)

Это коллекция name -> value, поэтому приведение к списку не годится.

Я бы попробовал преобразовать его в словарь.

Например:

Поскольку файлы cookie наследуются от NameObjectCollectionBase, вы можете GetAllKeys () и использовать этот список, чтобы получить все значения и поместить их в Словарь.

Например:

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

foreach(var key in Request.Cookies.GetAllKeys())
{
    cookieCollection.Add(key, Request.Cookies.Item[key]);
}
2
ответ дан 5 December 2019 в 08:22
поделиться

Если вам действительно нужен прямой List без соединения ключ-> значение, то для этого можно использовать Select в LINQ:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
5
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: