【问题标题】:Split and join C# string [duplicate]拆分和连接 C# 字符串 [重复]
【发布时间】:2012-10-18 19:02:11
【问题描述】:

可能重复:
First split then join a subset of a string

我正在尝试将一个字符串拆分为一个数组,取出第一个元素(使用它),然后将数组的其余部分连接成一个单独的字符串。

示例:

theString = "Some Very Large String Here"

会变成:

theArray = [ "Some", "Very", "Large", "String", "Here" ]

然后我想在变量中设置第一个元素并在以后使用它。

然后我想将数组的其余部分加入到一个新字符串中。

所以会变成:

firstElem = "Some";
restOfArray = "Very Large String Here"

我知道我可以将theArray[0] 用于第一个元素,但是如何将数组的其余部分连接到一个新字符串?

【问题讨论】:

  • 为什么不只用子字符串复制出第一个单词(使用空格作为索引),然后简单地从原始字符串中删除第一个单词?

标签: c# arrays string


【解决方案1】:

您可以使用string.Splitstring.Join

string theString = "Some Very Large String Here";
var array = theString.Split(' ');
string firstElem = array.First();
string restOfArray = string.Join(" ", array.Skip(1));

如果你知道你总是只想拆分第一个元素,你可以使用:

var array = theString.Split(' ', 2);

这样你就不必加入了:

string restOfArray = array[1];

【讨论】:

  • Split的双参数形式中,第一个参数应该是一个字符数组,而不是单个字符。请参阅 MSDN 上的 String.Split Method (Char[], Int32) 以及 user166390 在 this answer 中显示的示例。
  • @DavidRR 正确。但更好的是使用 1-arg 形式拆分所有白色字符。在 OP 的示例中,似乎是单个空格字符也可能是两个空格,或者一个 TAB
【解决方案2】:

嗯,这是我的“答案”。它使用的事实是,String.Split 可以被告知持有许多应该拆分的项目(我发现其他答案中缺少这些项目):

string theString = "Some Very Large String Here";
var array = theString.Split(new [] { ' ' }, 2); // return at most 2 parts
// note: be sure to check it's not an empty array
string firstElem = array[0];
// note: be sure to check length first
string restOfArray = array[1];

这与Substring 方法非常相似,只是方式不同。

【讨论】:

  • 正是我要建议自己的。拆分的简单性,但没有再次加入的开销。
【解决方案3】:

您可以拆分和连接字符串,但为什么不使用子字符串呢?然后你只会得到一个拆分,而不是将字符串拆分为 5 个部分并重新连接它。最终结果是一样的,但是子字符串可能会快一点。

string lcStart = "Some Very Large String Here";
int lnSpace = lcStart.IndexOf(' ');

if (lnSpace > -1)
{
    string lcFirst = lcStart.Substring(0, lnSpace);
    string lcRest = lcStart.Substring(lnSpace + 1);
}

【讨论】:

  • 将拆分限制为 2 可以避免“N 部分”问题 - 在这种情况下,对于一些小的 C,两者都应该在 O(1) 中表现良好。
  • 根据我的经验,Substring 导致了太多的 ±1 错误。我有更好的运气将计数留给机器并关闭重要字符。
  • 我对其进行了测试,对于 5000 次迭代,子字符串最终会快 1/1000 毫秒。这归结为编码实践的问题。代码的长度也没有太大的不同(边界检查以确保拆分返回两个条目)。重要的是为工作选择正确的工具,而我的意思是分成五块然后重新加入其中的四块不是正确的工具。
  • @SheridanBulger 如果您想真正找到性能差异,请不要增加迭代次数,而是增加字符串的大小。如果您在博士论文中执行这两个操作(甚至几次),您会看到更深刻的差异。如果您永远不会在大型数据集上使用它,那么显然性能无关紧要。
猜你喜欢
  • 2017-08-16
  • 2018-04-13
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多