c# - C#: 将地址对象转换为字符串的最佳方法是什么?

  显示原文与译文双语对照的内容
139 4

具有 AddressLine1.AddressLine2.郊区。状态。邮政编码的地址对象。( 有更多的内容,但这已经足够了) 。另外,每个属性都是字符串。我正在使用 C# 3.0.

我想表示它是一个字符串,但是我正在发现,由于所有。语句,我在创建一个具有较高圈复杂性的方法。

假定分配给每个属性的字符串与属性( IE AddressLine1 ="AddressLine1")的名称相同。"。"。我希望地址表示如下:

"AddressLine1 AddressLine2郊区状态邮政编码"。

我现在做的是用一个简单的String.Format( )

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

这一切都很好,直到我发现这些字段可以以是空的。"。"。特别是 AddressLine2.结果是额外不需要的空间。"。"。当你获得一行时,这些空间特别烦人。

为了解决这个问题,我只能想到,我必须手动构建字符串,并且只将地址属性添加到字符串。

ie

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....

是否有更优雅和/或者简洁的方法来实现这一点,我不考虑?尽管我觉得自己的解决方案 messy messy bloated bloated bloated但是我想不出更好的方法来做到。

我只知道,这是我想要做的,但我只是想把这个放在一个比我知道更好的方法上。如果没有更好的选择,那么。"。"。但是如果有的话,我会学到一些我之前不知道的。

提前致谢!

时间:原作者:0个回答

82 3

这可能不是最有效的方法,但它是简洁的。你可以以将你想要的项目放入 array,并且过滤出没有重要值的值,然后加入它们。

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

也许更有效,但更难读取,将值聚合为 StringBuilder,e.g.

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,但你没有提到语言版本,所以我假设这是正确的) 。

原作者:
100 4

我推荐你使用 StringBuilder 类。原因是 System.String 是不可变的,因此对字符串所做的每个更改只返回一个新字符串。

如果要在文本中表示对象,可以以重写 ToString() 方法并将实现放在它的中。

最后但并非最不重要的是,使用 Linq,你可以像Greg榉木那样在这里加入这些,而不是使用 string.Join() 使用:

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

希望这有帮助

原作者:
107 5

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

原作者:
120 0

构建 多行 联系人摘要时遇到类似的问题,可能有几个空字段。我做了相同的事情,除了我使用了一个字符串构建器,不要继续连接到一个字符串。

原作者:
95 1

如果你的数据不完全可以靠,那么你将需要在某个地方创建另一个只读属性( 把它叫做 FormattedAddress ) 。这样,你不必更改任何代码,在某些时候,你可以以清理或者更改规则。

和 +1,建议使用 StringBuilder,而不是连接字符串。

原作者:
81 5

我知道这很旧,但是我感觉到了一个通用的解决方案并以这种方式实现了我的矿井:

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();
}
原作者:
...