Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建字符串生成器的数组而不是字符串_C#_String_Stringbuilder - Fatal编程技术网

C# 创建字符串生成器的数组而不是字符串

C# 创建字符串生成器的数组而不是字符串,c#,string,stringbuilder,C#,String,Stringbuilder,我正在使用c#在窗口应用程序中创建一个应用程序。我有一个字符串数组,它的值将在每个计时器滴答事件中更新。稍后,我必须将此数组转换为对象数组。我知道,如果我们多次修改字符串,创建新的字符串对象可能会很耗时。所以我想使用stringBuilder 比方说,在计时器滴答声事件中: for (int i = 0; i < 10; i++) { n[i] = i.ToString(); } for(int i=0;i

我正在使用c#在窗口应用程序中创建一个应用程序。我有一个字符串数组,它的值将在每个计时器滴答事件中更新。稍后,我必须将此数组转换为对象数组。我知道,如果我们多次修改字符串,创建新的字符串对象可能会很耗时。所以我想使用stringBuilder

比方说,在计时器滴答声事件中:

for (int i = 0; i < 10; i++)
  {
     n[i] = i.ToString();
  }
for(int i=0;i<10;i++)
{
n[i]=i.ToString();
}
其中n是字符串数组,我想使用stringbuilder而不是数组。
可能吗?我该怎么做?如何将stringBuilder类型转换为对象类型?

您可以保留字符串数组,并在循环中使用
stringBuilder

var myValues = new String[100];

void tick() {
 var sb = new StringBuilder();

 for (int i = 0; i < 10; i++){
  sb.append(i.ToString());
 }

 myValues.add(sb.ToString());
}
var myValues=新字符串[100];
空勾(){
var sb=新的StringBuilder();
对于(int i=0;i<10;i++){
某人附加(i.ToString());
}
添加(sb.ToString());
}

这会将0到10范围内的所有值添加到一个字符串中。我不知道你为什么需要这个,所以如果你想做一些不同的事情,你应该澄清。

你可以这样做

 StringBuilder obj=new StringBuilder();

    for (int i = 0; i < 10; i++)
      {
          obj.append(i.ToString());
      }
StringBuilder obj=新的StringBuilder();
对于(int i=0;i<10;i++)
{
obj.append(i.ToString());
}

此处不需要
StringBuilder
。只有在多次处理(通常:连接)单个字符串时才调用StringBuilder。您有许多小的和不相关的字符串


您可能想要的是将数组
string[]
替换为
列表

以下是另一种不需要使用数组或
StringBuilder
的方法,如果序列不太大,这种方法应该足够有效:

string nums = String.Join("", Enumerable.Range(0, 10));
但是,如果输入已经是一个数组,
string.Join
非常有效。在这种情况下,使用
StringBuilder
可能会更有效:

string nums =  Enumerable.Range(0, 10)
    .Aggregate(new StringBuilder(), (a, b) => a.Append(b))
    .ToString();

我建议您使用如下代码:

class Program
{
    static void Main(string[] args)
    {
        var dic = new Dictionary<int, StringBuilder>();

        //Initialize dictionary
        for (int i = 0; i < 10; i++)
        {
            dic.Add(i, new StringBuilder());
        }

        TimerElapsed(dic);

        TimerElapsed(dic);

        Process(dic.Values.ToArray());
    }

    public static void Process(object[] objects)
    {
        //Do your processing
    }

    public static void TimerElapsed(IDictionary<int, StringBuilder> dic)
    {
        for (int i = 0; i < 10; i++)
        {
            dic[i].Append(i.ToString());
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var dic=新字典();
//初始化字典
对于(int i=0;i<10;i++)
{
添加(i,新StringBuilder());
}
复发时间(dic);
复发时间(dic);
进程(dic.Values.ToArray());
}
公共静态无效进程(对象[]对象)
{
//做你的处理
}
公共静态无效时间重复(IDictionary dic)
{
对于(int i=0;i<10;i++)
{
dic[i].Append(i.ToString());
}
}
}

这样的代码将为您带来收集和灵活性的好处(例如:您可以轻松地转换为数组)

如果您想转换为对象数组,为什么要先转换为字符串?为什么不直接使用对象?@MatthewWatson他指的是非原语、非值(引用类型)我必须多次调用这个字符串数组,程序将连续运行1-2天,数组将在每个计时器滴答声中被调用。你不能“调用”字符串。如果代码执行
s+=
对于相同的
s
多次,然后使用SB.@mahua22,这没有什么区别,您仍然不需要StringBuilder。这就是创建一个长字符串。我想将其存储为数组。在每个计时器滴答声中,每个索引的值都将更改。