我有一堆需要使用 .Trim() 的字符串,但它们可以为空。如果我可以做类似的事情会更简洁:
string endString = startString !?? startString.Trim();
如果左边的部分不为空,则基本上返回右边的部分,否则只返回空值。我刚刚结束了使用三元运算符,但是有没有为此目的使用空合并运算符?
我有一堆需要使用 .Trim() 的字符串,但它们可以为空。如果我可以做类似的事情会更简洁:
string endString = startString !?? startString.Trim();
如果左边的部分不为空,则基本上返回右边的部分,否则只返回空值。我刚刚结束了使用三元运算符,但是有没有为此目的使用空合并运算符?
您可以创建一个扩展方法,该方法null
在尝试修剪值时返回。
public String TrimIfNotNull(this string item)
{
if(String.IsNullOrEmpty(item))
return item;
else
return item.Trim();
}
请注意,您不能将其命名为 Trim,因为扩展方法不能覆盖实例方法。
不规范:不是我喜欢它,但你可以使用:
string endString = (startString ?? String.Empty).Trim();
为了规范,最好作为@Kevin's 之类的扩展方法:
string endString = (startString == null ? null : startString.Trim());
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();
尽管我还编写了一个名为“safeTrim”的字符串扩展方法,它可以在一种方法中完成您所描述的操作,而不必每次都使用这个方法。查看Kevin对代码的回复。
编辑:哇,我有各种各样的倒退,错误命名的变量和反转的三元运算符,更有理由编写一个扩展方法和代码检查它比我做得更好!
从 C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) 开始,您可以使用空条件成员访问:
string? endString = startString?.Trim();
很抱歉死灵,但我遇到了同样的问题,我使用 lambda 操作解决了这个问题。它不是最漂亮的,但它使我的代码保持简洁。
遗憾的是 C# 不支持静态导入或单个函数导入,但无论如何:
在某处定义此函数:
private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
if( parent == null ) return default(TResult);
return operation( parent );
}
然后在您的示例中使用它:
String endString = N(startString, s => s.Trim());
如果第一个参数为 null,则该N
函数返回null
,否则它将使用该值作为参数评估指定的 lambda 函数。
当然,您可以像这样嵌套它。例如,要安全地取消引用长链,例如
String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;
如果这些属性或方法中的任何一个返回 null 那么您必须在任何地方插入 null 检查,或者您可以这样做:
String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);
正如我所说,它不是最漂亮的:)
N
您可以通过制作的扩展方法来简化这一点System.Object
,如下所示:
String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );
...我认为这更整洁。
采用
string endString = (startString ?? "").Trim();
如果 startString 为空,则使用 empy 字符串。但是,当为 null 时,这不会返回endString
null。
快进到 2021 年:
10 年后startString?.Trim()
绝对是更好的选择。这确实返回null
。
以下不传播 null 但它接受 null 作为参数并在这种情况下返回一个空字符串。
using Microsoft.VisualBasic; // you need to add a reference to Microsoft.VisualBasic.dll
...
string endString = Strings.Trim(startString);
...
鸭&跑...
作为旁注,如果您使用的是 .NET 4,则String.IsNullOrWhiteSpace
可以使用一种新的便捷方法。