C# 如果var为null,如何忽略c

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

我正在加入一堆字符串以生成一个超弦,但是如果一个参数为null,我需要忽略它。目前,除了在单独的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;

不确定如何解决此问题。

您可以通过运算符?:在方法中检查字符串

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;
}