假设我有一个字符串:
string mystring = "34234234d124";
Run Code Online (Sandbox Code Playgroud)
我想得到这个字符串的最后四个字符"d124".我可以使用SubString,但它需要几行代码.
是否可以使用C#在一个表达式中获得此结果?
Arm*_*yan 387
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?
Run Code Online (Sandbox Code Playgroud)
如果你是正面的,你的字符串长度至少为4,那么它甚至更短:
mystring.Substring(mystring.Length - 4);
Run Code Online (Sandbox Code Playgroud)
Ste*_*cya 202
您可以使用扩展方法:
public static class StringExtension
{
public static string GetLast(this string source, int tail_length)
{
if(tail_length >= source.Length)
return source;
return source.Substring(source.Length - tail_length);
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话:
string mystring = "34234234d124";
string res = mystring.GetLast(4);
Run Code Online (Sandbox Code Playgroud)
RJ *_*mer 45
好的,所以我看到这是一篇旧帖子,但为什么我们要重写已在框架中提供的代码?
我建议您添加对框架DLL"Microsoft.VisualBasic"的引用
using Microsoft.VisualBasic;
//...
string value = Strings.Right("34234234d124", 4);
Run Code Online (Sandbox Code Playgroud)
Col*_*nic 44
2020 年更新:C# 8.0 终于让这一切变得简单:
> "C# 8.0 finally makes this easy"[^4..]
"easy"
Run Code Online (Sandbox Code Playgroud)
您也可以以相同的方式对数组进行切片,请参阅索引和范围。
the*_*tar 30
你所要做的就是......
String result = mystring.Substring(mystring.Length - 4);
Run Code Online (Sandbox Code Playgroud)
Cem*_*Cem 29
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)
Run Code Online (Sandbox Code Playgroud)
dtb*_*dtb 26
使用Substring实际上非常简短且可读:
var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
// result == "d124"
Run Code Online (Sandbox Code Playgroud)
Ami*_*wat 18
您可以简单地使用SubstringC#的方法.对于前者
string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);
Run Code Online (Sandbox Code Playgroud)
它将返回结果0000.
Ane*_*een 12
一个简单的解决方案是:
string mystring = "34234234d124";
string last4 = mystring.Substring(mystring.Length - 4, 4);
Run Code Online (Sandbox Code Playgroud)
Tro*_*xey 11
string var = "12345678";
var = var[^4..];
// var = "5678"
Run Code Online (Sandbox Code Playgroud)
这是索引运算符,字面意思是“从末尾 (^4) 到末尾 (..) 取最后四个字符”
Erç*_*ğlu 10
定义:
public static string GetLast(string source, int last)
{
return last >= source.Length ? source : source.Substring(source.Length - last);
}
Run Code Online (Sandbox Code Playgroud)
用法:
GetLast("string of", 2);
Run Code Online (Sandbox Code Playgroud)
结果:
的
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;
Run Code Online (Sandbox Code Playgroud)
对变体的完整概述:我想扩展现有的答案,提到在 C# 8 或更高版本中使用新范围:\nJust slicingmystring[^4..](此处示例 3)进行切片似乎很容易,但这有一些陷阱,您将看到:
让代码可供所有人使用可能的字符串,甚至是那些短于 4 的字符串,需要某种形式的条件!如果你想复制代码,我建议示例 5 或 6。
\nstring mystring ="C# 8.0 finally makes slicing possible";\nRun Code Online (Sandbox Code Playgroud)\n1:切片取末尾部分 - 通过指定从开头省略多少个字符- 这是 VS 2019 建议的:
\nstring example1 = mystring[Math.Max(0, mystring.Length - 4)..] ;\nRun Code Online (Sandbox Code Playgroud)\n2:切片取末尾部分——通过指定从末尾取多少个字符:
\nstring example2 = mystring[^Math.Min(mystring.Length, 4)..] ;\nRun Code Online (Sandbox Code Playgroud)\n3:切片取末尾部分 -不使用 Max/Min,而是使用 ?: 运算符:
\nstring example3 = (mystring.length > 4)? mystring[^4..] : mystring); \nRun Code Online (Sandbox Code Playgroud)\n就我个人而言,我比第一个更喜欢第二个和第三个变体。
\n\n无效的?但关于普遍性,我们还没有完成。到目前为止的每个示例都会抛出空字符串异常。要考虑 null(如果您不\xc2\xb4t 在 C# 8 或更高版本中使用不可为空的字符串),并且在没有 \'if\' 的情况下执行此操作(经典示例 \'with if\' 已在另一个答案中给出),我们需要:
\n4:考虑 null 进行切片- 通过指定要省略的字符数:
\nstring example4 = mystring?[Math.Max(0, mystring.Length - 4)..] ?? string.Empty;\nRun Code Online (Sandbox Code Playgroud)\n5:考虑 null 进行切片- 通过指定要采用的字符数:
\nstring example5 = mystring?[^Math.Min(mystring.Length, 4)..] ?? string.Empty;\nRun Code Online (Sandbox Code Playgroud)\n6:使用?: 运算符(以及其他两个 \'?\' 运算符 ;-)考虑 null 进行
切片: \n(不能将其整体放入字符串插值中,例如 WriteLine。)
string example6 = (mystring?.Length > 4) ? filePath[^4..] : mystring ?? string.Empty;\nRun Code Online (Sandbox Code Playgroud)\n7:C# 6 或 7.x 的旧式 Substring() 的等效变体: \n(您不能将其整体放入字符串插值中,例如 WriteLine。)
string example7 = (mystring?.Length > 4) ? mystring.Substring(mystring.Length- 4) : mystring ?? string.Empty;\nRun Code Online (Sandbox Code Playgroud)\n优雅降级?\n我喜欢 C# 的新功能。像上一个示例一样将它们放在一行可能看起来有点过分。我们最终得到了一点 perl\xc2\xb4ish,\xc2\xb4t 不是吗?\n但是它\xc2\xb4s 是一个很好的学习示例,我可以在经过测试的库方法中使用它一次。\n更好的是,我们可以得到如果我们想要并避免所有这些特定于 null 的处理,请在现代 C# 中摆脱 null。
\n这样的库/扩展方法作为快捷方式确实很有用。尽管 C# 取得了进步,但您必须自己编写一些比针对每个小字符串操作需求重复上面的代码更容易使用的东西。
\n我是从 BASIC 开始的人之一,40 年前就已经有了 Right$(,)。有趣的是,仍然可以将 VB 中的 Strings.Right(,) 与 C# 一起使用,如另一个答案中所示。\n这过去和现在都非常容易使用,而无需考虑所有边缘情况。
\nC# 选择了精确而不是优雅的降级(与旧的 BASIC 相反),我的意思是,如果发生不清楚的事情,它总是会抛出异常,而不是使用适用于大多数情况的默认值..\n结果,但我不\认为这种方式有很大的未来,正如最后的例子所示。\n使用带选项的默认配置会更方便。无论如何,通过一些自己编写的库例程很容易克服这个问题。
\n因此,在这些答案中复制您喜欢的任何适当的变体,并为自己定义一个优雅的快捷函数,我的是一个名为 RightChars(int) 的扩展函数。
\n就是这样:
int count = 4;
string sub = mystring.Substring(mystring.Length - count, count);
Run Code Online (Sandbox Code Playgroud)
与之前的一些答案相比,主要区别在于,当输入字符串为:时,这段代码会考虑:
这里是:
public static class StringExtensions
{
public static string Right(this string str, int length)
{
return str.Substring(str.Length - length, length);
}
public static string MyLast(this string str, int length)
{
if (str == null)
return null;
else if (str.Length >= length)
return str.Substring(str.Length - length, length);
else
return str;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
string x = "34234234d124";
string y = x.Substring(x.Length - 4);
Run Code Online (Sandbox Code Playgroud)