C# 如果var为null,如何忽略c
我正在加入一堆字符串以生成一个超弦,但是如果一个参数为null,我需要忽略它。目前,除了在单独的if语句中编译所有参数外,我无法思考如何执行此操作。请帮忙: 这是密码C# 如果var为null,如何忽略c,c#,C#,我正在加入一堆字符串以生成一个超弦,但是如果一个参数为null,我需要忽略它。目前,除了在单独的if语句中编译所有参数外,我无法思考如何执行此操作。请帮忙: 这是密码 public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype, string includeresults, string includemap, stri
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;
不确定如何解决此问题。您可以通过运算符?:在方法中检查字符串
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 : "";
}
我真的会这样重构它:
public void LinkBuilder(params string[] links)
{
string completeLink = String.Join("&", links.Where(x=>!String.IsNullOrEmpty(x)));
}
为字符串创建一个可枚举的集合,使用一点linq过滤掉空值,然后将其与字符串重新连接在一起。连接: 如果你真的想组装一个查询字符串,有更好的方法 例如,您可以使用以下方法利用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();
}
}
然后
将为您提供:
foo=bar&num=1&cat=bad&dog=good&needsEscaping=%u00e9%22%26
如果目标是避免将每个参数包装在If语句中,则可以将它们添加到列表中,然后使用String.Join和Linq.Select 下面将接受一个我认为可能更好维护的集合。我重新考虑了一下
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;
}
通过这种方式,您可以传递一个集合来构建您的URL,然后它将为您返回巨大的URL。您有大量的选择,我个人喜欢Maksim的答案。除了其他,您确定不需要对参数进行URL编码吗?你真的想在URL中输入密码吗?什么是超级字符串?超级字符串是更小的字符串的组合strings@Seth厨房,如果我组合超弦,我会得到超弦吗?不,如果你组合两个超弦,你会得到。。。。对不起,这是GiliusMaximus的妻子。他将无法继续他的职务。他的大脑刚刚爆炸。这将在执行赋值之前,将所有的“&”添加到字符串thoughuse string.IsNullOrEmpty,即:sharedKey=string.IsNullOrEmptysharedKey?string.Empty:&+SharedKey可能使其成为params参数,因此调用方甚至不需要创建数组…为了便于使用,您可以添加params关键字public void LinkBuilderparams string[]links好的,我认为这是赢家,但我会将params关键字添加到方法参数-public void LinkBuilderparams string[]链接-这样用户仍然可以用逗号分隔的字符串调用它-LinkBuildermybaselink,mysharedkey,myservice…-但该方法将它们作为字符串数组接受。此外,问题并没有要求空字符串应为空ignored@Stumblor-但除非另有说明,否则这似乎是假定的,如果忽略null,也会清空。 foo=bar&num=1&cat=bad&dog=good&needsEscaping=%u00e9%22%26
public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype,
string includeresults, string includemap, string username, string password)
{
var allParams = new List<string>
{
baselink,
sharedkey,
service,
period,
bulletintype,
includeresults,
includemap,
username,
password
};
var completeLink = "?" + String.Join("&", allParams.Select(p => p != null));
}
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;
}