我想为String
类编写一个扩展方法,这样如果输入字符串的长度超过提供的长度N
,则只有第一个N
字符是显示。
以下是它的样子:
public static string TruncateLongString(this string str, int maxLength)
{
if (str.Length <= maxLength)
return str;
else
//return the first maxLength characters
}
我可以使用哪种String.*()
方法仅获取N
的第一个str
字符?
答案 0 :(得分:338)
public static string TruncateLongString(this string str, int maxLength)
{
if (string.IsNullOrEmpty(str))
return str;
return str.Substring(0, Math.Min(str.Length, maxLength));
}
答案 1 :(得分:55)
string truncatedToNLength = new string(s.Take(n).ToArray());
这个解决方案有一个很小的好处,如果n大于s.Length,它仍然是正确的。
答案 2 :(得分:30)
您可以使用LINQ str.Take(n)
或str.SubString(0, n)
,后者会为ArgumentOutOfRangeException
引发n > str.Length
例外。
请注意,LINQ版本会返回IEnumerable<char>
,因此您必须将IEnumerable<char>
转换为string
:new string(s.Take(n).ToArray())
。
答案 3 :(得分:11)
简单地:
public static String Truncate(String input,int maxLength)
{
if(input.Length > maxLength)
return input.Substring(0,maxLength);
return input;
}
答案 4 :(得分:10)
每当我必须在C#中进行字符串操作时,我都会错过Visual Basic中的旧Left
和Right
函数,这些函数比Substring
更易于使用。
因此,在我的大多数C#项目中,我为它们创建了扩展方法:
public static class StringExtensions
{
public static string Left(this string str, int length)
{
return str.Substring(0, Math.Min(length, str.Length));
}
public static string Right(this string str, int length)
{
return str.Substring(str.Length - Math.Min(length, str.Length));
}
}
注意:
Math.Min
部分存在,因为Substring
在输入字符串的长度小于请求的长度时抛出ArgumentOutOfRangeException
,如前面答案中的一些评论中已经提到的那样。
string longString = "Long String";
// returns "Long";
string left1 = longString.Left(4);
// returns "Long String";
string left2 = longString.Left(100);
答案 5 :(得分:5)
public static string TruncateLongString(this string str, int maxLength)
{
return str.Length <= maxLength ? str : str.Remove(maxLength);
}
答案 6 :(得分:4)
如果我们讨论验证也是为什么我们没有检查空字符串条目。任何具体原因?
我认为以下方式有帮助,因为IsNullOrEmpty是一个系统定义的方法,三元运算符的圈复杂度= 1而if(){} else {}的值为2。
public static string Truncate(string input, int truncLength)
{
return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
? input.Substring(0, truncLength)
: input;
}
答案 7 :(得分:1)
我在我的项目中添加了这个,因为在我使用它的地方很有可能在循环中使用它,在一个在线托管的项目中因此我不希望任何崩溃,如果我可以管理它。长度适合我的专栏。这是C#7
只需一行:
public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";
答案 8 :(得分:0)
substring(int startpos, int lenght);
答案 9 :(得分:0)
.NET Substring方法充满了危险。我开发了可以处理各种情况的扩展方法。妙处是它保留了原始行为,但是当您添加一个附加的“ true”参数时,它随后将使用扩展方法来处理异常,并根据索引和长度返回最符合逻辑的值。例如,如果长度为负数,则向后计数。您可以在https://dotnetfiddle.net/m1mSH9的小提琴中查看具有各种值的测试结果。这将为您提供有关如何解析子字符串的清晰思路。
我总是将这些方法添加到我的所有项目中,而不必担心代码中断,因为某些更改和索引无效。下面是代码。
public static String Substring(this String val, int startIndex, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
}
public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex, length);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
int newfrom, newlth, instrlength = val.Length;
if (length < 0) //length is negative
{
newfrom = startIndex + length;
newlth = -1 * length;
}
else //length is positive
{
newfrom = startIndex;
newlth = length;
}
if (newfrom + newlth < 0 || newfrom > instrlength - 1)
{
return string.Empty;
}
if (newfrom < 0)
{
newlth = newfrom + newlth;
newfrom = 0;
}
return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
}
我在2010年5月在http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html
上对此发表了博客。答案 10 :(得分:0)
部分出于概述的目的(不包括LINQ解决方案),下面的两个单行代码解决了/:id1/:id2
允许负值的注意事项以及空字符串的情况:
int maxLength
方式(来自Paul Ruane's answer):Substring
public static string Truncate(this string s, uint maxLength) =>
s?.Substring(0, Math.Min(s.Length, (int)maxLength));
方式(来自kbrimington's answer):Remove
答案 11 :(得分:0)
使用 C# 8
public static string TruncateLongString(this string str, int maxLength)
{
if (string.IsNullOrEmpty(str)) return str;
return str[.. Math.Min(str.Length, maxLength)];
}
答案 12 :(得分:-4)
string.Substring(0,N); // 0 - 开始索引和n - 字符数