C#/ .NET:重新格式化一个很长的字符串

时间:2011-06-24 18:14:45

标签: c# .net string

我需要逐个字符地读取字符串,并构建一个新字符串作为输出。

在C#中执行此操作的最佳方法是什么?

使用StringBuilder?使用一些writer / stream?

请注意,不会有I / O操作 - 这严格来说就是内存中的转换。

6 个答案:

答案 0 :(得分:5)

如果在编译时无法确定字符串的大小并且它也可能相对较大,则应使用StringBuilder进行连接,因为它的作用类似于可变字符串。

var input = SomeLongString;

// may as well initialize the capacity as well
// as the length will be 1 to 1 with the unprocessed input.
var sb = new StringBuilder( input.Length );
foreach( char c in input )
{
    sb.Append( Process( c ) );
}

答案 1 :(得分:2)

如果它只是一个字符串,你可以使用一个集合来保存你的字符,然后使用构造函数创建字符串:

IEnumerable<char> myChars = ...;
string result = new string(myChars);

使用Linq并在方法ProcessChar(char c)的帮助下将每个字符转换为其输出值,这可能只是一个查询转换(使用以IEnumerable<char>作为输入的字符串构造函数):< / p>

string result = new string(sourceString.Select(c => ProcessChar(c)));

这与使用StringBuilder一样有效(因为StringBuilder在字符串类内部用于构造IEnumerable)的字符串,但在我看来更具可读性。

答案 2 :(得分:0)

Stringbuilder通常是一个不错的选择。我在网页上写了很多javascript使用它。

答案 3 :(得分:0)

StringBuilder是构建新字符串的好主意,因为您可以有效地为其添加新值。至于从输入字符串中读取字符,StringReader就足够了。

答案 4 :(得分:0)

void Main()
{
    string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";

    var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(x => x != ';'));

    transformedTString.Dump();
}

如果你有更复杂的逻辑,你可以将验证移到单独的谓词方法

void Main()
{
    string myLongString = "lf;kajsd;lfkjal;dfkja;lkdfja;lkdjf;alkjdfa";

    var transformedTString = string.Join(string.Empty, myLongString.ToCharArray().Where(MyPredicate));

    transformedTString.Dump();
}

public bool MyPredicate(char c)
{
    return c != ';';
}

答案 5 :(得分:-1)

读取字符串和输出字符串之间有什么区别?我的意思是你为什么要用char读取char?

我使用此方法读取字符串

string str = "some stuff";
string newStr = ToNewString(str);


string ToNewString(string arg)
{
   string r = string.Empty;
   foreach (char c in arg)
      r += DoWork(c);
   return r;
}

char DoWorK(char arg)
{
    // What do you want to do here?
}