我加入一个字符串加载来制作一个超级字符串,但如果一个为空,我需要忽略一个参数。目前我无法想到如何做到这一点,除了在单独的if语句中包含所有参数。帮助:
这里是代码
public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype,
string includeresults, string includemap, string username, string password)
{
sharedkey = "&" + sharedkey;
service = "&" + service;
period = "&" + period;
bulletintype = "&" + bulletintype;
includeresults = "&" + includeresults;
includemap = "&" + includemap;
username= "&" + username;
password = "&" + password;
string completeLink = sharedkey + service + period + bulletintype + includeresults + includemap + username +
password;
不确定如何解决这个问题。
答案 0 :(得分:22)
我真的会这样重构:
public void LinkBuilder(params string[] links)
{
string completeLink = String.Join("&", links.Where(x=>!String.IsNullOrEmpty(x)));
}
答案 1 :(得分:1)
你可以通过运算符检查字符串吗?:in method。
public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype,
string includeresults, string includemap, string username, string password)
{
sharedkey = checkValue(sharedkey);
service = checkValue(service );
period = checkValue(period );
bulletintype = checkValue(bulletintype );
includeresults = checkValue(includeresults );
includemap = checkValue(includemap );
username= checkValue(username );
password = checkValue(password );
string completeLink = sharedkey + service + period + bulletintype + includeresults + includemap + username +
password;
}
private String checkValue(String str)
{
return str != null ? "&" + str : "";
}
答案 2 :(得分:1)
创建一个可枚举的字符串集合,使用一些linq过滤掉空值,然后使用String.Join
将它们重新连接在一起:
var elements =
new[]{baselink, sharedkey, service, period,
bulletintype, includeresults, includemap,
username, password};
var nonNullElements = elements.Where(e => e != null);
var outputString = String.Join("&", nonNullElements);
如果你真的试图组装一个查询字符串,那就有更好的方法。
例如,您可以使用以下方法利用HttpUtility
和反射来将匿名对象解析为查询字符串:
public static class ObjEx
{
public static string ToQueryString(this object data)
{
var collection = data.GetType()
.GetProperties()
.Aggregate(
HttpUtility.ParseQueryString(string.Empty),
(prev,curr) => {
var val = curr.GetValue(data);
var propName = curr.Name;
prev.Add(propName,val.ToString());
return prev;
});
return collection.ToString();
}
}
然后
var data = new{foo = "bar", num = 1, cat = "bad", dog = "good", needsEscaping = "é\"&"};
Console.WriteLine(data.ToQueryString());
会给你:
foo=bar&num=1&cat=bad&dog=good&needsEscaping=%u00e9%22%26
答案 3 :(得分:1)
如果目标是避免将每个参数包装在if语句中,您可以将它们添加到列表中,然后使用com.boardgames.chess
和String.Join
Linq.Select
答案 4 :(得分:1)
下面会接受Collection
,我认为可以更好地维护。我考虑了一下。
public string LinkBuilder(Dictionary<string, string> parameters)
{
var url = String.Empty;
foreach(var parameter in parameters)
if(!string.IsNullOrEmpty(parameter.Value))
url += String.Format("&{0}={1}", parameter.Key, parameter.Value);
return url;
}
通过这种方式,您可以传递一个集合来构建您的网址,然后它会return
为您提供巨大的网址。你有大量的选择,我个人喜欢马克西姆的回答。