这是一种扩展方法,用于获取被截断为最大长度的字符串。

是否有任何注释?

评论

不,这和它所获得的一样好。这段代码没有太多要说的。


WithWithLength(null,1)不会抛出异常,而WithMaxLength(“”,1)会抛出异常吗?

@KonradMorawski都不会抛出异常。 WithMaxLength(null,1)将返回null,而WithMaxLength(“”,1)将返回“” ...

您为了什么目的截断?您如何定义长度?您想保持哪种序列完整(例如代码点或什至是文本元素)?

@CodesInChaos我有一个旧系统,其中动作设置存储在带有详细说明的表中。然后,当执行操作时,说明将保存在数据库中具有不同最大长度的多个位置中,而我只想保留空间并丢弃其余空间。

#1 楼

如果您使用的是C#6.0,我相信您可以删除null检查:

public static string WithMaxLength(this string value, int maxLength)
{
    return value?.Substring(0, Math.Min(value.Length, maxLength));
}


除此之外,就像Jeroen所说的:它得到了。

类和参数的命名与我的命名完全一样,并且扩展方法的名称很不错,尽管我会尝试找到一个更好地表示截断的名称当valuemaxLength长时会发生...但WithMaxLength并不是一个坏名字。

评论


\ $ \ begingroup \ $
我同意您的命名要求。该方法将截断字符串(如果需要),命名应反映出来。如果我要使用一个名为WithMaxLength的东西,即使我传递string.Empty作为输入值,我也可能希望返回到字符串的字符串实际上具有maxLength。
\ $ \ endgroup \ $
–里克·戴文(Rick Davin)
15年8月15日在15:07

\ $ \ begingroup \ $
“ Keep”或“ Left”是这种方法的通用名称。
\ $ \ endgroup \ $
–ToolmakerSteve
19 Mar 7 '19 at 9:48



\ $ \ begingroup \ $
该函数允许maxLength为负值,该值未经处理并产生意外结果(与问题所提供的代码相同)。
\ $ \ endgroup \ $
–马特
20 May 15 '12:44



#2 楼

存在不一致-对于maxLengthvalue,可以原谅null的负值,但会导致其他所有输入都异常(因为Substring会抛出ArgumentOutOfRangeException)。 -快速失败

public static string WithMaxLength(this string value, int maxLength)
{
    if (maxLength < 0)
    {
       throw new ArgumentOutOfRangeException("maxLength must be equal to or greater than 0");
    }
    // ...


或忽略这两种情况的负值:

public static string WithMaxLength(this string value, int maxLength)
{
    if (value == null)
    {
        return null;
    }
    if (maxLength < 0)
    {
        return "";
    }
    return value.Substring(0, Math.Min(value.Length, maxLength));
}


倾向于选择前者-maxLength小于0可能是我们不希望在地毯下扫过的问题(实现错误)的症状。这也与Substring本身的行为方式一致。

评论


\ $ \ begingroup \ $
正确!接得好。一个小的改进:删除null-check if语句,然后按如下所示修改return语句:return value?.Substring(0,Math.Min(value.Length,maxLength));;会做同样的事情,但是要短得多。 :-)
\ $ \ endgroup \ $
–马特
20 May 15 '12:47



\ $ \ begingroup \ $
我的答案发布于5年前,我不确定C#6.0(引入了null安全运算符)当时是否已经发布;)显然,我同意这就是现在的方法-接受的答案
\ $ \ endgroup \ $
– Konrad Morawski
20 May 16 '13:55



\ $ \ begingroup \ $
您的答案仍然有效,并且我同意,在C#中较晚引入的空检查运算符。接受的答案不会检查maxLength <0,我喜欢您提到的快速失败方法。因此,我的提示仅适用于null检查。顺便说一句,我正在寻找.ToString()方法的截断参数,因为我认为.ToString()之后的截断效率不高。您是否知道如何实现?回想一下,.ToString()可以在每个对象或原始类型上调用。
\ $ \ endgroup \ $
–马特
20-05-18在7:05



#3 楼

好吧,Mat的杯子已经使用条件成员访问运算符对我能找到的扩展方法中的代码进行了唯一的改进。除此之外,只有方法名称。这太长和尴尬了。 Truncate环很好,每个人都理解。

public static class StringExtensions
{
    public static string Truncate(this string value, int maxLength)
    {
        return value?.Substring(0, Math.Min(value.Length, maxLength));
    }
}


#4 楼

Per Mat的杯子的答案:


我试图找到一个更好的名称,当值长于maxLength ...时,截断将发生。


我不同意方法的名称是执行此操作的地方。不是。 WithMaxLength是一个很好的名字。

但是...截断发生的情况应该记录在案。我不确定C#到底有什么可用,但是大多数语言都具有显示IDE文档的格式。

我被告知C#版本看起来像这样:

 WithMaxLength 


我们当然应该将此类文档添加到我们的方法中,以清楚地了解会发生什么情况用的方法。我认为该方法本身的任何其他名称都超出了描述性的范围,并且涉足了过于冗长的领域(这来自编写Objective-C的人。

评论


\ $ \ begingroup \ $
我想您正在寻找标签。
\ $ \ endgroup \ $
–RubberDuck
15年8月15日在17:33