.net 如何循环通过WebHeaderCollection

.net 如何循环通过WebHeaderCollection,.net,windows-mobile,httpwebresponse,.net,Windows Mobile,Httpwebresponse,如何在Windows phone 7中通过从HttpWebResponse获取的WebHeaderCollection循环获取密钥和值?我们尝试了枚举器;这样,我们只得到键,而不是值。我们这样做是为了得到一个重定向的URL。我真的不喜欢.NET中有时存在这样的特殊集合,这些集合不容易为期望值进行迭代。使事情变得不那么用户友好。无论如何,如果您想麻烦地添加扩展方法: For i As Integer = 0 To Response.Headers.Count - 1 'Response.He

如何在Windows phone 7中通过从
HttpWebResponse
获取的
WebHeaderCollection
循环获取密钥和值?我们尝试了
枚举器;这样,我们只得到键,而不是值。我们这样做是为了得到一个重定向的URL。

我真的不喜欢.NET中有时存在这样的特殊集合,这些集合不容易为期望值进行迭代。使事情变得不那么用户友好。无论如何,如果您想麻烦地添加扩展方法:

For i As Integer = 0 To Response.Headers.Count - 1
   'Response.Headers.Get(i)
Next
// call in your main code
KeyValuePair<string, string>[] headers = webResponse.Headers.GetHeaders();

// extension: 
public static class Xtension
{
    public static KeyValuePair<string, string>[] GetHeaders(this WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        var keyVals = new KeyValuePair<string, string>[keys.Length];
        for (int i = 0; i < keys.Length; i++)
            keyVals[i] = new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        return keyVals;
    }
}
private static string Serialize(this System.Net.WebHeaderCollection value)
{
    var response = new System.Text.StringBuilder();
    foreach (string k in value.Keys)
        response.AppendLine(k + ": " + value[k]);
    return response.ToString();
}
//调用主代码
KeyValuePair[]headers=webResponse.headers.GetHeaders();
//分机:
公共静态类Xtension
{
public static KeyValuePair[]GetHeaders(此WebHeaderCollection WebHeaderCollection)
{
string[]keys=webHeaderCollection.AllKeys;
var keyVals=新的KeyValuePair[keys.Length];
for(int i=0;i
我认为这是一个糟糕的收藏

看。我更喜欢这个:

var headers = new System.Net.WebHeaderCollection();
headers.Add("xxx", "yyy");
headers.Add("zzz", "fff");
headers.Add("xxx", "ttt");
for(int i = 0; i < headers.Count; ++i)
{
    string header = headers.GetKey(i);
    foreach(string value in headers.GetValues(i))
    {
        Console.WriteLine("{0}: {1}", header, value);
    }
}

在WP7/Silverlight中,我这样做

foreach (string key in headers.AllKeys)
{
   Console.WriteLine("Header : " + key + " ---> " + headers[key]);
}
在银色的灯光下。 如果要逐个输入键和值,请执行以下操作:

foreach (string key in webHeaderCollection)
{
    var value = webHeaderCollection[key];
    // do something with key and value
}
如果需要键和值的字典:

var dic = webHeaderCollection.AllKeys.ToDictionary(k => webHeaderCollection[k]);
foreach (var pair in MyDic)
{
    // do something with pair.Key and pair.Value
}

当我试图从VisualStudio调试器中查看WebHeaderCollection中的键值对时,我从Google找到了这个问题

简单解决方案(回顾):在“监视调试”窗口中使用的WebHeaderCollection.ToString()方法将完成以下任务:

webheadercollection.ToString()
因此,如果您有一个名为
request
的HttpWebRequest:

request.Headers.ToString()

我的解决方案,作为一种扩展方法:

// call in your main code
KeyValuePair<string, string>[] headers = webResponse.Headers.GetHeaders();

// extension: 
public static class Xtension
{
    public static KeyValuePair<string, string>[] GetHeaders(this WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        var keyVals = new KeyValuePair<string, string>[keys.Length];
        for (int i = 0; i < keys.Length; i++)
            keyVals[i] = new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        return keyVals;
    }
}
private static string Serialize(this System.Net.WebHeaderCollection value)
{
    var response = new System.Text.StringBuilder();
    foreach (string k in value.Keys)
        response.AppendLine(k + ": " + value[k]);
    return response.ToString();
}
来点C#6:)怎么样


若您真的想使用扩展方法来获得作为KeyValuePair数组的标题列表,那个么您可能需要使用IEnumerable接口

public static class WebHeaderCollectionExtensions
{
    public static IEnumerable<KeyValuePair<string, string>> GetHeaders(this System.Net.WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        for (int i = 0; i < keys.Length; i++)
        {
            yield return new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        }
    }
}

为什么需要全新的键值对集合?如果它只用于循环,那么您可以返回
IEnumerable
,而无需构建中间集合。您会问:“为什么需要全新的集合?”?1) AllKeys已经是一个字符串[],如果不是,我将枚举它。2) 在大多数用例中,有人需要整个集合来搜索多个标题。我的“全新系列”只是一个数组。3) 我绝对不是那种总是在我认为最好的时候,在任何可能的时候被统计员吸引的人群。考虑到1和2,我更喜欢这里的轻量级数组,因为如果这个数组被称为大量数组的话,它的性能通常会更高一些。但这是我的偏好,请随意选择;)有趣的是,我本以为
yield return
中的
IEnumerable
性能更高,至少对于“不完全枚举”(即“先停止后…”),但正如您所说的,“轻量级数组”在这两种情况下都更快——尽管更难看;)我认为这是一个糟糕的收藏。”-完全同意!与其使用元组,不如使用
Enumerable.Range(0,headers.Count).ToDictionary(i=>headers.Keys[i],headers.GetValues)Arghh。。在单独的一行上使用相同的键编写值的整个想法是类似于HTTP头。而
SelectMany
将以同样的方式对键进行乘法。@drzaus,
GetValues
返回一个数组,但这就是为什么有一个
foreach
的原因<代码>元组
是在不分组的情况下循环通过标题
WebHeaderCollection
已提供分组访问。你为什么还要做另一个看起来完全一样的?..@drzaus、@JonSchneider、
“、
”&“
”-可以是HTTP头值的一部分。好的ol字符串数组。你也可以在上面做linq。这就是
resp.Headers.AllKeys
,而不是
resp.AllKeys
,然后是
resp.Headers[key]
?这正是我要找的!
public static class WebHeaderCollectionExtensions
{
    public static IEnumerable<KeyValuePair<string, string>> GetHeaders(this System.Net.WebHeaderCollection webHeaderCollection)
    {
        string[] keys = webHeaderCollection.AllKeys;
        for (int i = 0; i < keys.Length; i++)
        {
            yield return new KeyValuePair<string, string>(keys[i], webHeaderCollection[keys[i]]);
        }
    }
}
foreach (var x in h.GetHeaders())
{
    Console.WriteLine(x.Key + ": " + x.Value);
}