0

也许我没有正确的关键字,但我似乎无法找到如何去做。

假设我有这两个字符串:

firstString = "I am a string";

secondString = "I am a long";

有没有一种方法可以让我将部分字符串 1 移动到字符串 2 ?

移动,而不是复制。

最终结果将是:

firstString = "I am a"

secondString = "I am a long string"

问题

我有一个包含很多字符的字符串。我想将此字符串发送到 SQLServer,但接收它的函数不能容纳超过 8000 个字符。所以我需要每 8000 个字符发送一个请求。

  • 检查 String1 是否长于 8000 字符
  • 如果是,则取前 8000 个字符并将它们移动到 String2
  • 将 String2 插入 SQL
  • 重复
  • 如果长度小于 8000 字符,则将字符串 1 发送到 SQL
4

5 回答 5

5

字符串是不可变的,因此您真正要做的是将一部分重新分配firstString给自身,并将另一部分连接到secondString. 没有内置方法可以实现这一点,但代码非常简单

secondString += firstString.Substring(6);
firstString = firstString.Substring(0,6);
于 2013-05-16T13:06:17.433 回答
3

有没有一种方法可以让我将部分字符串 1 移动到字符串 2 ?移动,而不是复制。

由于 .NET 字符串是不可变的,它们不能支持具有“移动”语义的方法。对字符串的每一次修改都需要创建一个新对象,包括复制

编辑(响应问题的编辑)看起来您的问题与将字符串拆分为 8K 字符有关,不一定要移动字符串的一部分。在这种情况下,您可以使用这个简单的代码将部分字符串传递给 SQL:

string string1 = GetReallyLongString();
const int sqlMax = 8000;
while (true) {
    if (string1.Length > sqlMax) {
        SendToSql(string1.Substring(0, sqlMax));
        string1 = string1.Substring(sqlMax);
    } else {
        SendToSql(string1);
        break;
    }
}

这是关于 ideone 的快速演示

于 2013-05-16T13:05:33.590 回答
2

由于字符串是不可变的,因此您无法更改它们。您使用原始字符串的部分创建新字符串:

firstString = "I am a string";
secondString = "I am a long";

// concatenate second string with part from first string
secondSring = secondString + firstString.Substring(6);

// create a new string from part of the first string
firstString = firstString.Substring(0, 6);
于 2013-05-16T13:09:18.447 回答
0

受到 dasblinkenlight 解决方案的启发,但使用yield了静态方法,并使用尽可能少的子字符串来减少内存使用。

using System;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        string string1 = "quick brown fox jumps over the lazy dog";
        foreach (var strSection in string1.SplitInto(8))
            Console.WriteLine("'{0}'", strSection);
    }
}
public static class MyExtensions
{
    public static IEnumerable<string> SplitInto(this string value, int size)
    {
        for (int i = 0; i < value.Length; i += size)
        {
            if (i + size <= value.Length)
                yield return value.Substring(i, size);
            else
                yield return value.Substring(i);
        }
    }
}

看到它在Ideone运行。

于 2013-05-16T13:05:38.103 回答
0

很多方法可以做到这一点:

var partofstring = firstString.Substring(10, 14);
firstString = firstString.Replace(partofstring, "");

secondString += partofstring;
于 2013-05-16T13:06:00.157 回答