【问题标题】:How to ignore if var is null c#如果 var 为空,如何忽略 c#
【发布时间】:2015-12-14 09:21:40
【问题描述】:

我正在加入大量字符串以创建一个超字符串,但如果一个参数为空,我需要忽略一个参数。目前,除了将所有参数包含在单独的 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;

不知道如何解决这个问题。

【问题讨论】:

  • 除此之外,您确定不需要对参数进行 URL 编码吗?您真的想在 URL 中输入密码吗?
  • 什么是“超弦”?
  • 超字符串是较小字符串的组合
  • @Seth Kitchen,如果我结合超弦,我会得到超弦吗?
  • 不,如果你结合两个史诗字符串,你会得到一个....对不起,这是 GiliusMaximus 的妻子。他将无法继续他的职位。他的大脑刚刚爆炸。

标签: c#


【解决方案1】:

我真的会这样重构它:

public void LinkBuilder(params string[] links)
{
    string completeLink = String.Join("&", links.Where(x=>!String.IsNullOrEmpty(x)));
}

【讨论】:

  • 可能将其设为params 参数,因此调用者甚至不需要创建数组...
  • 为了方便使用,您可以添加 params 关键字 public void LinkBuilder(params string[] links) (stackoverflow.com/questions/7580277/why-use-the-params-keyword)
  • 好的,我认为这是赢家,但我会将 params 关键字添加到方法参数中 - public void LinkBuilder(params string[] links) - 这样用户仍然可以使用用逗号分隔的字符串数 - LinkBuilder(mybaselink, mysharedkey, myservice...) - 但该方法接受它们作为字符串数组。
  • 同样问题并没有要求忽略空字符串
  • @Stumblor - 但除非另有说明,否则似乎会假设,如果 null 被忽略,也会清空。
【解决方案2】:

如果目标是避免将每个参数包装在 if 语句中,您可以将它们添加到列表中,然后使用 String.JoinLinq.Select

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这会将所有的 '&' 添加到字符串中
    • 在进行分配之前使用 string.IsNullOrEmpty ,即: sharedKey = string.IsNullOrEmpty(sharedKey) ? string.Empty :"&" + sharedKey
    【解决方案4】:

    下面会接受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;
    }
    

    这样,您将传递一个集合来构建您的 URL,然后它将 return 为您提供巨大的 URL。你有很多选择,我个人喜欢 Maksim 的回答。

    【讨论】:

      【解决方案5】:

      创建一个可枚举的字符串集合,使用一些 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

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        • 2012-01-07
        • 2022-11-28
        相关资源
        最近更新 更多