代码之家  ›  专栏  ›  技术社区  ›  mezoid

将Address对象转换为String的最佳方法是什么?

  •  2
  • mezoid  · 技术社区  · 16 年前

    我有一个Address对象,它具有AddressLine1、AddressLine2、Suburb、State、ZipCode等属性。(还有更多,但这个例子就足够了)。此外,这些属性中的每一个都是字符串。我使用的是C#3.0。

    我想把它表示为字符串,但当我这样做的时候,我发现由于所有的if语句,我创建的方法具有很高的圈复杂度。..

    “地址行1地址行2郊区州邮政编码”。

    现在,我最初的方法是通过一个简单的String.Format()

    String.Format("{0} {1} {2} {3} {4}", address.AddressLine1, 
    address.AddressLine2, address.Suburb, address.State, address.ZipCode);
    

    这一切都很好,直到我发现其中一些字段可能是空的。..特别是地址行2。结果是增加了不必要的空间。..当你连续看到几个时,这尤其令人恼火。

    string addressAsString = String.Empty;
    
    if (!String.IsNullOrEmpty(address.AddressLine1))
    {
        addressAsString += String.Format("{0}", address.AddressLine1);
    }
    
    if(!String.IsNullOrEmpty(address.AddressLine2))
    {
        addressAsString += String.Format(" {0}", address.AddressLine2);
    }
    
    etc....
    

    有没有一种更优雅和/或简洁的方法来实现这一点,而我没有考虑过?我的解决方案只是 感觉

    提前感谢!

    7 回复  |  直到 16 年前
        1
  •  4
  •   Greg Beech    16 年前

    这可能不是最有效的方法,但它很简洁。您可以将所需的项放入数组中,过滤掉没有显著值的项,然后将它们连接起来。

    var items = new[] { line1, line2, suburb, state, ... };
    var values = items.Where(s => !string.IsNullOrEmpty(s));
    var addr = string.Join(" ", values.ToArray());
    

    StringBuilder

    var items = new[] { line1, line2, suburb, state, ... };
    var values = items.Where(s => !string.IsNullOrEmpty(s));
    var builder = new StringBuilder(128);
    values.Aggregate(builder, (b, s) => b.Append(s).Append(" "));
    var addr = builder.ToString(0, builder.Length - 1);
    

    我可能会倾向于第一种实现,因为它更简单,更易于维护,然后如果性能有问题,可以考虑更像第二种实现(如果它确实更快……)。

    (请注意,这需要C#3.0,但你没有提到你的语言版本,所以我假设这是可以的)。

        2
  •  1
  •   Jeroen Landheer    16 年前

    在组合字符串时,我建议您使用StringBuilder类。这是因为一个系统。字符串是不可变的,因此您对字符串所做的每一次更改都会返回一个新字符串。

    如果你想在文本中表示一个对象,最好重写ToString()方法并将你的实现放在那里。

    StringBuilder sb = new StringBuilder();
    foreach (var item in values) {
      sb.Append(item);
      sb.Append(" ");
    }
    

        3
  •  1
  •   Ash M    16 年前

    请参阅MSDN http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx 有关实现IFormatProvider的信息。

    然后,您可以编写如下代码:
    地址。ToString(“s”);//短地址
    地址。ToString(“whatever”);//无论你定义什么自定义格式。

    干杯

        4
  •  0
  •   Ed Swangren    16 年前

    首先,地址需要某些信息,所以你不应该允许没有邮政编码的地址。您还可以通过将每个属性初始化为空字符串,或将每个属性作为构造函数的参数来确保它们永远不会为null。这样你就知道你已经在处理有效数据了,所以你可以输出一个格式化的字符串,而不需要IsNullOrEmpty检查。

        5
  •  0
  •   Jason    16 年前

        6
  •  0
  •   chris    16 年前

        7
  •  0
  •   jxfreeman    6 年前

    private static string GetFormattedAddress(
        string address1,
        string address2,
        string city,
        string state,
        string zip)
    {
        var addressItems =
            new []
            {
                new[] { address1, "\n" },
                new[] { address2, "\n" },
                new[] { city, ", " },
                new[] { state, " " },
                new[] { zip, null }
            };
    
        string suffix = null;
        var sb = new StringBuilder(128);
    
        foreach (var item in addressItems)
        {
            if (!string.IsNullOrWhiteSpace(item[0]))
            {
                // Append the last item's suffix
                sb.Append(suffix);
    
                // Append the address component
                sb.Append(item[0]);
    
                // Cache the suffix
                suffix = item[1];
            }
        }
    
        return sb.ToString();
    }