Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 组合查询字符串的实用程序?_.net_Asp.net_Query String - Fatal编程技术网

.net 组合查询字符串的实用程序?

.net 组合查询字符串的实用程序?,.net,asp.net,query-string,.net,Asp.net,Query String,有组合查询字符串的实用程序吗?我要找的东西是: 输入:组合(“test=a&test2=b”、“test3=c”)结果:“test=a&test2=b&test3=c” 输入:组合(“test=a&test2=b”和“”)结果:“test=a&test2=b” 输入:Combine(“,“test3=c”)结果:“test3=c” 也许还有一些奇怪的: 输入:Combine(“&test=a&test2=b”,“?test3=c”)Result:“test=a&test2=b&test3=c”这

有组合查询字符串的实用程序吗?我要找的东西是:

输入:
组合(“test=a&test2=b”、“test3=c”)
结果:
“test=a&test2=b&test3=c”

输入:
组合(“test=a&test2=b”和“”)
结果:
“test=a&test2=b”

输入:
Combine(“,“test3=c”)
结果:
“test3=c”

也许还有一些奇怪的:


输入:
Combine(“&test=a&test2=b”,“?test3=c”)
Result:
“test=a&test2=b&test3=c”

这样的方法对您不起作用吗

string Combine(string s1, string s2)
{
     if(string.IsNullOrEmpty(s1)) return s2;
     if(string.IsNullOrEmpty(s2)) return s1;
     //several '?' at start are not expected so we can use TrimStart
     return s1.TrimStart('?', '&') + "&" + s2.TrimStart('?', '&');
}

您可以将任意数量的查询字符串与该字符串组合

CombineQueryStrings(params string[] segments ){
    List<string> list = new List<string>();
    foreach (var s in segments)
    {
        list.Add(s.Trim('?', '&'));
    }
    return string.Join("&", list.ToArray());
}
CombineQueryString(参数字符串[]段){
列表=新列表();
foreach(分段中的var s)
{
添加(s.Trim(“?”、“&”);
}
返回字符串.Join(&),list.ToArray();
}

我不确定您是否能获得满足您需求的现成解决方案。您可以使用扩展方法来实现这一点。有关扩展方法的更多信息,请参阅:

这是一个.NET 4.0解决方案,因为正在使用的
Join
重载并不是完全现成的。但是,它使用.NET
System.Web.HttpUtility
正确解析查询字符串

var r1 = HttpUtility.ParseQueryString("?test3=c");
var r2 = HttpUtility.ParseQueryString("");
var r3 = HttpUtility.ParseQueryString("test2=d");

var total = new NameValueCollection();

total.Add(r1);
total.Add(r2);
total.Add(r3);

var qs = String.Join(
    "&", 
    total.AllKeys.Select(key => key + "=" + total[key]));

Console.WriteLine(qs);
产出:

// test3=c&test2=d

我使用下面的类来帮助我修改和设置查询字符串。虽然它不能解决您的确切问题,但您可以使用它并添加一些自己的函数来完成您想要的任何事情。我只是觉得当我想要修改查询字符串时,将其作为IDictionary处理很方便

public static class QueryStringExtensions
{
    /// <summary>
    /// Creates a dictionary from a query string or other parameter collection
    /// </summary>
    /// <param name="queryString"></param>
    /// <returns></returns>
    public static IDictionary<string, string> ToDictionary(this NameValueCollection queryString)
    {
        var dict = new Dictionary<string, string>();
        foreach (string key in queryString.Keys)
        {
            dict[key] = queryString[key];
        }
        return dict;
    }

    /// <summary>
    /// Generates a query string from a dictionary
    /// </summary>
    /// <param name="dictionary"></param>
    /// <returns></returns>
    public static string ToQueryString(this IDictionary<string, string> dictionary)
    {
        if (dictionary.Count == 0) return "";
        var items = new List<string>();
        foreach (string key in dictionary.Keys)
        {
            items.Add(key + "=" + dictionary[key]);
        }
        return "?" + items.Concatenate("&");
    }

    /// <summary>
    /// Generates a query stirng from a dictionary only using the keys in the keys parameter
    /// </summary>
    /// <param name="dictionary"></param>
    /// <param name="keys"></param>
    /// <returns></returns>
    public static string ToQueryString(this IDictionary<string, string> dictionary, IEnumerable<string> keys)
    {
        var items = new List<string>();
        foreach (string key in dictionary.Keys.Intersect(keys))
        {
            items.Add(key + "=" + dictionary[key]);
        }
        if (items.Count == 0) return "";
        return "?" + items.Concatenate("&");
    }

    /// <summary>
    /// joins an enumerable around a seperator.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="input"></param>
    /// <param name="seperator"></param>
    /// <returns></returns>
    public static string Concatenate<T>(this IEnumerable<T> input, string seperator)
    {
        var ar = input.Select(i => i.ToString()).ToArray();
        return string.Join(seperator, ar);
    }
}
公共静态类QueryStringExtensions
{
/// 
///从查询字符串或其他参数集合创建字典
/// 
/// 
/// 
公共静态IDictionary ToDictionary(此NameValueCollection查询字符串)
{
var dict=新字典();
foreach(queryString.Keys中的字符串键)
{
dict[key]=查询字符串[key];
}
返回命令;
}
/// 
///从字典生成查询字符串
/// 
/// 
/// 
公共静态字符串ToQueryString(此IDictionary字典)
{
如果(dictionary.Count==0)返回“”;
var items=新列表();
foreach(dictionary.Keys中的字符串键)
{
添加(key+“=”+字典[key]);
}
返回“?”+项。连接(&);
}
/// 
///仅使用keys参数中的键从字典生成查询字符串
/// 
/// 
/// 
/// 
公共静态字符串ToQueryString(此IDictionary字典,IEnumerable键)
{
var items=新列表();
foreach(字典中的字符串键。键。相交(键))
{
添加(key+“=”+字典[key]);
}
如果(items.Count==0)返回“”;
返回“?”+项。连接(&);
}
/// 
///围绕分隔符连接可枚举项。
/// 
/// 
/// 
/// 
/// 
公共静态字符串连接(此IEnumerable输入,字符串分隔符)
{
var ar=input.Select(i=>i.ToString()).ToArray();
返回字符串.连接(分隔符,ar);
}
}

Combine(“,“test3=c”)case-property您似乎无法处理
Combine(“,”test3=c”)
case-property我认为这不是一个好主意,因为您在HttpUtility.ParseQueryString中解码URL编码的字符,并且在重新连接字符串时不进行编码。@iPhone初学者,代码示例只是为了演示一种实现OP要求的方法。这并不是一个完整的解决方案。作为旁注,
HttpUtility
类也有URL编码字符串的方法?OP所需要的只是适当的字符串连接和一些技巧。我不认为有理由解析字符串,解码它们,然后编码并再次连接。“哦,这是太多的工作和太多的地方,不能犯错误。@iPhone初学者,让我们同意不同意。提供答案是为了提供我认为对OP有帮助的信息,并展示了一个可能的解决方案。就这些,不多不少。说得好!我总是喜欢在这里发布代码,让它变得更好。仅供参考,ASP.NET Core有一个专用类型Microsoft.AspNetCore.Http.QueryString,用于处理查询字符串。它的Add方法完全符合您的要求。