18

我有一堆需要使用 .Trim() 的字符串,但它们可以为空。如果我可以做类似的事情会更简洁:

string endString = startString !?? startString.Trim();

如果左边的部分不为空,则基本上返回右边的部分,否则只返回空值。我刚刚结束了使用三元运算符,但是有没有为此目的使用空合并运算符?

4

8 回答 8

13

您可以创建一个扩展方法,该方法null在尝试修剪值时返回。

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

请注意,您不能将其命名为 Trim,因为扩展方法不能覆盖实例方法。

于 2010-05-17T21:20:47.817 回答
12

不规范:不是我喜欢它,但你可以使用:

string endString = (startString ?? String.Empty).Trim();

为了规范,最好作为@Kevin's 之类的扩展方法:

string endString = (startString == null ? null : startString.Trim());
于 2010-05-17T21:19:57.423 回答
4
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

尽管我还编写了一个名为“safeTrim”的字符串扩展方法,它可以在一种方法中完成您所描述的操作,而不必每次都使用这个方法。查看Kevin对代码的回复。

编辑:哇,我有各种各样的倒退,错误命名的变量和反转的三元运算符,更有理由编写一个扩展方法和代码检查它比我做得更好!

于 2010-05-17T21:19:28.300 回答
3

从 C# 6.0 (.NET Framework 4.6 / Visual Studio 2015) 开始,您可以使用空条件成员访问

 string? endString = startString?.Trim();
于 2018-07-27T19:01:50.740 回答
1

很抱歉死灵,但我遇到了同样的问题,我使用 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 );

...我认为这更整洁。

于 2013-02-18T06:22:57.663 回答
0

采用

string endString = (startString ?? "").Trim();

如果 startString 为空,则使用 empy 字符串。但是,当为 null 时,这不会返回endStringnull。

快进到 2021 年:
10 年后startString?.Trim()绝对是更好的选择。这确实返回null

于 2010-05-17T21:19:47.597 回答
-1

以下不传播 null 但它接受 null 作为参数并在这种情况下返回一个空字符串。

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

鸭&跑...

于 2010-05-17T21:31:16.727 回答
-1

作为旁注,如果您使用的是 .NET 4,则String.IsNullOrWhiteSpace可以使用一种新的便捷方法。

于 2010-05-17T21:37:36.913 回答