如何在C#中切割字符串?

27
string word = "hello";

我想要做的是将字符串切片,以便可以在控制台窗口中打印例如"elloh"。在Python中非常简单,但我不确定在C#中是否有特定的切片方法。


8
在Python中非常简单,C#中有哪些难点? - L.B
4
答案只需从此页面(http://msdn.microsoft.com/en-us/library/System.String%28v=vs.110%29.aspx)点击一到两次即可找到。学会使用文档,通常比询问更快。 - spender
2
@ljgww 你所问的问题有一个简单的答案 ;) :在dotnet中,所有字符代码点都以utf-16的形式存储在内部。只有当你将字符串渲染为字节时,编码才是相关的。 - spender
2
这需要重新打开,因为C# 8现在允许以类似于Python的方式进行切片。2022年的答案将会不同且更快。 - Panagiotis Kanavos
1
字符串操作——查找两个索引之间的字符串 - lastlink
显示剩余3条评论
6个回答

53

可以通过索引来获取字符串中的字符:

string word = "hello";
char h = word[0];

或字符串具有“切片”的方法:

int start = 0;
int length = 1;
string h = word.Substring(start, length);

为什么不阅读文档自己找出答案呢?


6
正确的答案但未被接受为答案? - Neo
6
@trampster:除非你是提问者Ali Appleby,否则请不要留下似乎回复其他评论的评论。现在看起来问题"......但不被接受为答案?"有你的回复,但我怀疑这不是事实。请注意避免误导他人。 - Lasse V. Karlsen
6
现在已经不是2014年了。如果你像我一样谷歌搜索如何切割字符串,因为你想使用Span,而Slice是Span使用的术语,那么你会得到这个答案。当Joel和Jeff创建这个网站时,他们非常明确地表示希望答案保持相关性。虽然Ali可能不再关心这个问题,但从谷歌点击进入这个页面的成千上万人却很在意。 - trampster
3
为什么你回复四年前的答案,好像在继续一场对话?他们不是为了今天、昨天或甚至去年给你发帖子。它是四年前为Ali Appleby发布的,并且当时是最新的。请问需要说明什么? - Ctrl S
4
与您无关并不意味着它是无关的。 - Ctrl S
显示剩余5条评论

11

“切片”的概念没有确切的翻译,但一般用 Substring 方法实现。

我不确定您具体的分割标准是什么,但这个方法可以满足您的要求:

void Main()
{
    var input = "hello";
    var output = input.Substring(1, input.Length - 1) + input.Substring(0, 1);

    Console.WriteLine (output);
}

9

要对字符串进行“切片”,您可以使用Substring方法:

string word = "hello";
string ordw = word.Substring(1) + word.Substring(0, 1);

然而,另一种解决方法是查看NSlice,这是一个专门处理类似Python数组切片的库。

这会使你所要求的工作更容易吗?不会。它是否能更轻松地“切片”不同类型的集合?可能。


1
不行,我想要返回一个 ReadOnlySpan<char> 的东西,我可以将其传递给 uint.Parse 而不必分配内存,这就是 substring 所做的。 - trampster
3
很抱歉,但这个答案是在2014年之前写的,在 ReadOnlySpan<char> 可用之前。当时这已经是最好的选择了。 - Lasse V. Karlsen
3
对于int.Parse(ReadOnlySpan<char>)的支持仅在.NET Core 2.1中实现,未在.NET Standard或.NET Framework中提供。由于您已经了解ReadOnlySpan<char>,我不确定您为什么对Substring抱怨,因为似乎您已经知道可以使用什么。您有问题吗? - Lasse V. Karlsen
到了2022年,我们可以使用跨度和切片。 - Panagiotis Kanavos

4
C# 8.0已添加了System.Range运算符,因此现在您可以像这样做:
string word = "hello";
Console.WriteLine(word[1..] + word[0]);

输出为"elloh"


2

不行,这会分配内存,所以会变慢。 - trampster
7
请不要因为有更好的替代方案就把整个互联网都标记为过时。我同意现在ReadOnlySpan<char>在某些情况下提供了更好的替代方案,但是如果你打算标记每个告诉人们使用"Substring"的答案为“不够好”,我害怕你会找到Cobol文档。 - Lasse V. Karlsen

1
也许您想要一个类似于这样的 扩展方法

public static string Rotate(this string s, int numberOfChars)
{
  if (string.IsNullOrEmpty(s))
    return s;
  numberOfChars %= s.Length;
  if (numberOfChars == 0)
    return s;
  if (numberOfChars < 0)
    numberOfChars += s.Length;

  return s.Substring(numberOfChars) + s.Remove(numberOfChars);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接