我最终编写了自己的帮助类来连接对象:ConcatHelper.cs。
您会在要点中看到一些示例,但也会在以下代码段中看到:
model.Summary = new ConcatHelper(", ")
.Concat(diploma.CodeProfession /* can be any object, will be null checked and ToString() called */)
.BraceStart() // if everything between the braces is null or empty, the braces will not appear
.Concat(diploma.CodeDiplomaType)
.Concat(label: DiplomaMessage.SrkRegisterId, labelSeparator: " ", valueDecorator: string.Empty, valueToAdd: diploma.SrkRegisterId)
.BraceEnd()
.Concat(diploma.CodeCountry)
.BraceStart()
.Concat(diploma.DateOfIssue?.Year.ToString(CultureInfo.InvariantCulture)) // no separator will be added if concatenated string is null or empty (no ", ,")
.BraceEnd()
.Concat(DiplomaMessage.Recognition, " ", string.Empty, diploma.DateOfRecognition?.Year.ToString(CultureInfo.InvariantCulture))
.ToString(); // results in something like: Drogist / Drogistin (Eidgenössischer Abschluss, SRK-Registrierungsnummer 3099-239), Irland (1991)
优点:
魂斗罗:
因此我现在开始覆盖域对象的许多ToString()
方法,如果有更好的方法,我不确定。
通过更好我的意思是:
如果你告诉我一个方便的方法,在没有帮助的情况下获得相同的结果,或者帮助我改进这门课程,我会很高兴。
问候, FLO
更新
请查看此gist以获取真实的UnitTest。
答案 0 :(得分:0)
变体1 - 像
这样的流var sb = new StringBuilder();
const string delimiter = ", ";
var first = true;
Action<object> append = _ => {
if(null!=_){
if(!first){ sb.Append(delimiter);}
first = false;
sb.Append(_.ToString());
}
}
append(diploma.X);
append(diploma.Y);
...
另一个 - 收集
var data = new List<object>();
data.Add(diploma.X);
data.Add(diploma.Y);
...
var result = string.Join(", ",data.Where(_=>null!=_).Select(_=>_.ToString()));
它的效率不高,但它允许您在数据准备和加入之间添加一些步骤来对收集本身做一些事情。
答案 1 :(得分:0)
我认为您的代码没有任何实际问题。但我更喜欢更简化的语法。它最终可能看起来像这样:
string result = ConcatHelper.Concat(
diploma.CodeProfession,
new Brace(
diploma.CodeDiplomaType,
new LabeledItem(label: DiplomaMessage.SrkRegisterId, labelSeparator: " ",
valueDecorator: string.Empty, valueToAdd: diploma.SrkRegisterId)
),
diploma.CodeCountry,
new Brace(
diploma.DateOfIssue?.Year.ToString(CultureInfo.InvariantCulture)
),
DiplomaMessage.Recognition
).ToString();
Concat()
属于static ConcatHelper Concat(objs object[] params)
类型。当然,Brace
和LabeledItem
需要由ConcatHelper处理(if (obj is LabeledItem) { ... }
)。
关于你的对照:
String.Format()
Concat
可以是静态的。只需在Concat调用中创建ConcatHelper对象即可。