使用扩展仅在 StringBuilder 中附加现有 string/values
Appending only existing string/values in StringBuilder using extension
我有这个方法,它按预期工作,如果字符串为空,它不会插入 <string, value>
,但是我有一个问题,字符串并不总是存在。如果字符串不存在,我想避免附加任何内容。
public static class StringBuilderExtension
{
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix)
where TValue : class
{
if (value != null)
{
sb.Append(prefix + value);
}
}
}
问题是我总是传递字符串键
sb.AppendIfNotNull(" width=\"", component.style.width + "\"");
这将显示为 width=""
,因为我实际附加了字符串。我怎样才能阻止这种情况发生。
如果我将它包裹在 if 语句中,我可以阻止它出现
if (item.width!= null)
{
sb.AppendIfNotNull(" width=\"", item.width + "\"");
}
对象示例。 属性 可能存在于一个对象中,但可能不存在于下一个对象中。例如颜色不存在则不追加:
{
'id': 'Test',
'type': 'Text',
'style': {
'color': 'black'
'textSize': '12'
}
},
{
'id': 'Test',
'type': 'Text',
'style': {
'textSize': '12'
}
}
当前方法签名无法做到这一点,但您可以分别传递前缀、您的值和后缀:
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix, string suffix)
where TValue : class
{
if (value != null)
{
sb.Append(prefix + value + suffix);
}
}
sb.AppendIfNotNull(item.width, " width=\"", "\"");
您可以简单地将您的添加从 string prefix
更改为接受 TValue
和 returns 的函数 string
public static class StringBuilderExtension
{
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, Func<TValue, string> transform)
where TValue : class
{
if (value != null)
{
sb.Append( transform( value ));
}
}
}
在这种情况下,只有当您实际拥有有效值时才会调用您的转换
使用它的示例方法可以是
sb.AppendIfNotNull( token.style?.width, value => $" width=\"{value}\"" );
其中 ?
表示有条件的空检查(所以如果 token.style
为空,它也将为空)
我在 dotnetfiddle 中添加了一个小示例,其中我确实删除了泛型类型限制(因为我在 ;) 中输入了数字)
我有这个方法,它按预期工作,如果字符串为空,它不会插入 <string, value>
,但是我有一个问题,字符串并不总是存在。如果字符串不存在,我想避免附加任何内容。
public static class StringBuilderExtension
{
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix)
where TValue : class
{
if (value != null)
{
sb.Append(prefix + value);
}
}
}
问题是我总是传递字符串键
sb.AppendIfNotNull(" width=\"", component.style.width + "\"");
这将显示为 width=""
,因为我实际附加了字符串。我怎样才能阻止这种情况发生。
如果我将它包裹在 if 语句中,我可以阻止它出现
if (item.width!= null)
{
sb.AppendIfNotNull(" width=\"", item.width + "\"");
}
对象示例。 属性 可能存在于一个对象中,但可能不存在于下一个对象中。例如颜色不存在则不追加:
{
'id': 'Test',
'type': 'Text',
'style': {
'color': 'black'
'textSize': '12'
}
},
{
'id': 'Test',
'type': 'Text',
'style': {
'textSize': '12'
}
}
当前方法签名无法做到这一点,但您可以分别传递前缀、您的值和后缀:
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, string prefix, string suffix)
where TValue : class
{
if (value != null)
{
sb.Append(prefix + value + suffix);
}
}
sb.AppendIfNotNull(item.width, " width=\"", "\"");
您可以简单地将您的添加从 string prefix
更改为接受 TValue
和 returns 的函数 string
public static class StringBuilderExtension
{
public static void AppendIfNotNull<TValue>(this StringBuilder sb, TValue value, Func<TValue, string> transform)
where TValue : class
{
if (value != null)
{
sb.Append( transform( value ));
}
}
}
在这种情况下,只有当您实际拥有有效值时才会调用您的转换
使用它的示例方法可以是
sb.AppendIfNotNull( token.style?.width, value => $" width=\"{value}\"" );
其中 ?
表示有条件的空检查(所以如果 token.style
为空,它也将为空)
我在 dotnetfiddle 中添加了一个小示例,其中我确实删除了泛型类型限制(因为我在 ;) 中输入了数字)