Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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#创建CSV字符串的有效方法?_C#_File_Csv_Io_Sortedlist - Fatal编程技术网

从列表/分类列表C#创建CSV字符串的有效方法?

从列表/分类列表C#创建CSV字符串的有效方法?,c#,file,csv,io,sortedlist,C#,File,Csv,Io,Sortedlist,我有一个实现异步SOAP的应用程序。每隔50-100毫秒,我将接收转换为SortedList对象的数据。我还有一个预定义的IList,其中包含SortedList中所有可能的键 我需要遍历IList并检查SortedList是否包含该键。如果有,我将该值写入csv字符串;如果没有,我将0.0写入csv字符串 注意:IList有400个键。分类列表通常比400小得多,最多100个左右 string MyText = timestamp.ToString("HH:mm:ss");

我有一个实现异步SOAP的应用程序。每隔50-100毫秒,我将接收转换为
SortedList
对象的数据。我还有一个预定义的
IList
,其中包含
SortedList
中所有可能的键

我需要遍历
IList
并检查
SortedList
是否包含该键。如果有,我将该值写入csv字符串;如果没有,我将0.0写入csv字符串

注意:IList有400个键。分类列表通常比400小得多,最多100个左右

        string MyText = timestamp.ToString("HH:mm:ss");
        for (int i = 0; i < AllKeys.Count; i++)
        {
            double info;
            if (MySortedList.TryGetValue(AllKeys[i], out info))
            {
                MyText += "," + info;
            }
            else
            {
                MyText += ",0.0";
            }
        }
        MyText += "\n";

        File.AppendAllText(filePath, MyText);
string MyText=timestamp.ToString(“HH:mm:ss”);
for(int i=0;i
我目前正在使用上述代码创建csv字符串,然后再将其写入我的文件。然而,我发现这段代码落后于我的应用程序

我需要帮助提高效率,以便存储传入数据所需的时间低于50毫秒。还有一些事情:

  • 我不必写入csv文件,我只需要快速存储数据。(以后我可以将序列化文件转换为csv文件)
  • 我考虑过使用LINQ,但我不熟悉查询,也不知道它的效率会有多高

编辑:我使用Conrad关于创建StreamWriter对象的建议解决了性能问题。我只是创建了一个静态StreamWriter对象,并在通信终止时关闭StreamWriter之前将所有文本写入其中。

以下是一些想法

1) 使用a来写入而不是文件。这将比写入内存然后写入文件的两个步骤更快

2) 如果可能的话,将工作并行化。例如,如果可以,您可以选择一个线程来处理消息,另一个线程来编写消息


3) 我不认为LINQ的目的是为了提高性能,而是简化数据操作

我确信我还没有想出最有效的算法,但至少这是一个起点。如果没有其他内容,您将注意到使用了
StringBuilder
,而不是串联字符串。仅此一项就可能为您带来一些性能方面的好处

该算法假设SortedList键和“数据”列表的顺序相同(从低到高)


可以使用聚合扩展方法在LINQ表达式中包含更多内容,但必须在累加器中使用字符串连接,所以我在这里没有说明这一点。

我同意Conrad的答案-但提高性能的另一个想法是进行反向查找,即从SortedList中提取每个元素,并在其他列表中进行查找(当然,我建议使用字典而不是列表,以便更快地查找)。

对于初学者,请尝试使用StringBuilder。一般来说,这种连接比本机连接要快得多(或者我听说过)。还有,你不是先提到IList拥有SortedList所有可能的键吗,然后你说你需要检查它是否有?我遗漏了什么吗?我有一个IList,它有400个双值,这是SortedList中所有可能的键。我收到的SortedList数据具有与其中一些键(不是全部)相关的值。例如,IList有(1,2,3,4)和sortedlist有([1,6.6],[3,7.9]),我的csv字符串将是“6.6,0.0,7.9,0.0”。谢谢,我刚刚尝试了这个,速度提高了不少。我还做了一些搜索,找到了这个性能测试图。第一个代码中的错误是SortedList中的最后一个键并不总是IList中的最后一个键。所以一个IList为(1,2,3,4,5)和一个SortedList为([1,6.6],[3,7.8])只会产生“6.6,0.0,7.8”。我喜欢并行化的想法,有没有可能从一个例子开始呢?我不确定如何编程好的线程管理,你能用一些代码澄清一下吗?如果我有一个列表(1,2,3,4)和分类列表([1,6.6],[3,7.9]),我将如何使用反向查找来获取字符串“6.6,0.0,7.9,0.0”?哎呀,完全错过了0.0部分!不,我认为反向查找在这里没有帮助。
var textBuilder = new StringBuilder(timestamp.ToString("HH:mm:ss"));

var index = 0;
foreach(double key in data.Keys)
{
    while(Allkeys[index] < key)
    {
        textBuilder.Append(",0.0");
        index++;
    }

    textBuilder.Append(",").Append(data[key]);
    index++;
}
MyText = textBuilder.Append(@"\n").ToString();
var textBuilder = new StringBuilder(timestamp.ToString("HH:mm:ss"));

var values = Allkeys.Select(
    key => data.ContainsKey(key) ? data[key].ToString() : "0.0")
    .ToArray();

var data = String.Join(",", values);
var MyText = textBuilder.Append(data).Append(@"\n").ToString();