获取NameValueCollection的所有值到字符串

时间:2011-08-06 13:38:47

标签: c# .net namevaluecollection

我有以下代码:

string Keys = string.Join(",",FormValues.AllKeys);

我试图玩弄get:

string Values = string.Join(",", FormValues.AllKeys.GetValue());

但当然这不起作用。

我需要类似的东西来获取所有值,但我似乎没有找到相同的代码来执行相同的操作。

P.S:我不想使用foreach循环,因为这超出了第一行代码的目的。

7 个答案:

答案 0 :(得分:36)

var col = new NameValueCollection() { { "a", "b" }, { "1", "2" } }; // collection initializer

var values = col.Cast<string>().Select(e => col[e]); // b, 2

var str = String.Join(",", values );  // "b,2"

您还可以创建一个扩展方法:

public static string Join(this NameValueCollection collection, Func<string,string> selector, string separator)
{
    return String.Join(separator, collection.Cast<string>().Select(e => selector(e)));
}

用法:

var s = c.Join(e => String.Format("\"{0}\"", c[e]), ",");

此外,您可以轻松地将NameValueCollection转换为更方便的Dictionary<string,string>,以便:

public static IDictionary<string,string> ToDictionary(this NameValueCollection col)
{
    return col.AllKeys.ToDictionary(x => x, x => col[x]);
}

给出:

var d = c.ToDictionary();

正如我发现使用Reflector,NameValueCollection.AllKeys在内部执行循环以收集所有te键,因此似乎c.Cast<string>()更为可取。

答案 1 :(得分:25)

string values = string.Join(",", collection.AllKeys.Select(key => collection[key]));

答案 2 :(得分:9)

以下从URL参数列表创建一个字符串。

string.Join(", ", 
            Request.QueryString
                   .AllKeys
                   .Select(key => key + ": " + Request.QueryString[key])
      .ToArray())

page.aspx?id=75&page=3&size=7&user=mamaci

将是

id: 75, page: 3, size: 7, user: mamaci

答案 3 :(得分:8)

string values = 
    string.Join(",", FormValues.AllKeys.SelectMany(key => FormValues.GetValues(key)));

编辑:其他答案可能是也可能不是您想要的。它们看起来更简单,但结果可能不是您在任何情况下都要寻找的结果,但是它们可能是(您的里程可能会有所不同)。

请注意,NameValueCollection不像字典那样是1:1映射。您可以为同一个键添加多个值,这就是像.GetValues(key)这样的函数返回数组而不是单个字符串的原因。

如果您有一个已添加

的集合
 collection.Add("Alpha", "1");
 collection.Add("Alpha", "2");
 collection.Add("Beta", "3");

检索collection["Alpha"]会产生"1,2"。检索collection.GetValues("Alpha")会产生{ "1", "2" }。现在,恰好您正在使用逗号将您的值一起合并为一个字符串,因此隐藏了这种差异。但是,如果您要加入其他值(例如感叹号),则其他答案的结果将为

"1,2!3"

这里的代码是

"1!2!3"

使用演示您喜欢的行为的代码段。

答案 4 :(得分:0)

如果您使用System.Web.HttpUtility.ParseQueryString(...)解析了查询字符串,则只需使用ToString(),就不必重新发明轮子。

尽管结果是NameValueCollection,但基础类型是HttpValueCollection,它具有必要的ToString()覆盖以构建查询字符串。

答案 5 :(得分:0)

我使用Azure DocumentDB作为我的日志记录机制,因此编写了一个动态对象,但是你得到了要点......

public class LogErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        int responseCode = new int();

        // Has the exception been handled.  Also, are custom errors enabled
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            return;

        // Check if custom exception, if so get response code
        if (filterContext.Exception is CustomException)
            responseCode = (int)((CustomException)filterContext.Exception).Code;

        // Log exception
        string id = Logging.Write(LogType.Error, new
        {
            ResponseCode = responseCode,
            Exception = new
            {
                Message = filterContext.Exception.Message,
                Data = filterContext.Exception.Data,
                Source = filterContext.Exception.Source,
                StackTrace = filterContext.Exception.StackTrace,
                InnerException = filterContext.Exception.InnerException != null ? new
                {
                    Message = filterContext.Exception.InnerException.Message,
                    Data = filterContext.Exception.InnerException.Data,
                    Source = filterContext.Exception.InnerException.Source,
                    StackTrace = filterContext.Exception.InnerException.StackTrace
                } : null
            },
            Context = filterContext.Controller != null ? new
            { 
                RouteData = filterContext.Controller.ControllerContext.RouteData,
                QueryString = filterContext.Controller.ControllerContext.HttpContext.Request.Url.Query,
                FormParams = filterContext.Controller.ControllerContext.HttpContext.Request.Form != null ? string.Join(";#", filterContext.Controller.ControllerContext.HttpContext.Request.Form.AllKeys.Select(key => key + ":" + filterContext.Controller.ControllerContext.HttpContext.Request.Form[key])) : string.Empty,
                Model = (filterContext.Controller is Controller) ? ((Controller)filterContext.Controller).ModelState : null,
                ViewBag = filterContext.Controller.ViewBag,
                ViewData = filterContext.Controller.ViewData
            } : null,
            ActionResult = filterContext.Result != null ? filterContext.Result : null,
            Referrer = filterContext.HttpContext.Request.UrlReferrer != null ? filterContext.HttpContext.Request.UrlReferrer : null
        }).Result;

        // Mark exception as handled and return
        filterContext.ExceptionHandled = true;

        // Test for Ajax call
        if (IsAjax(filterContext))
        {
            // Construct appropriate Json response
            filterContext.Result = new JsonResult()
            {
                Data = new
                {
                    code = responseCode,
                    id = id,
                    message = filterContext.Exception.Message
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };

        }
        else
        {
            var result = new ViewResult();
            result.ViewName = "_CustomError";
            result.ViewBag.CorrelationId = id;
            filterContext.Result = result;
        }
    }

    /// <summary>
    /// Determine if the request is from an Ajax call
    /// </summary>
    /// <param name="filterContext">The request context</param>
    /// <returns>True or false for an Ajax call</returns>
    private bool IsAjax(ExceptionContext filterContext)
    {
        return filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
    }
}

我有 CustomException ,我在其中检查应用程序集响应代码。

此外,我使用查询字符串,表单数据和模型,以便我可以看到模型绑定器之前和之后传递的值。

如果它和Ajax调用,我返回一个Json格式的响应。否则,我会返回自定义错误页面。

答案 6 :(得分:-1)

List<string> values = new List<string>();
values.AddRange(all.AllKeys.SelectMany(all.GetValues).Where(getValues => getValues != null));
string Values = string.Join(",", values.ToArray());

您可以尝试上述内容。