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

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

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

注意: IList有400个密钥。 SortedList通常远小于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); 

我目前正在使用上面的代码创建csv字符串,然后将其写入我的文件。 但是,我发现此代码滞后于我的应用程序。

我需要帮助提高效率,以便存储传入数据的时间少于50毫秒。 一些额外的东西:

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

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

这是一些想法。

1)使用StreamWriter编写而不是File。 这比写入内存然后写入文件的两步要快。

2)如果一切可能并行化工作。 例如,如果您可以使用一个线程来处理消息,而另一个线程则可以编写消息。

3)我不认为LINQ的目的是提高性能,但更容易操作数据

我敢肯定我还没有提出最有效的算法,但这至少是一个起点。 如果没有别的,你会注意到StringBuilder的使用,而不是连接字符串。 仅此一项就可能为您带来一些性能上的好处。

该算法假设SortedList键和“data”列表以相同的方式(从低到高)排序。

 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(); 

只是看看上面的内容,我确定有一个错误,但不确定在没有花费更多时间和/或测试的情况下或在哪里。

可能的LINQ解决方案更具说明性:

 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(); 

可以使用Aggregate扩展方法在LINQ表达式中包含更多内容,但是您必须在累加器中使用字符串连接,所以我没有在此处显示。

我同意康拉德的回答 – 还有一个改进性能的想法是进行反向查找,即从SortedList中取出每个元素并在其他列表中进行查找(当然,我建议使用字典而不是列表以便更快地查找)。