从列表/分类列表C#创建CSV字符串的有效方法?
我有一个实现异步SOAP的应用程序。每隔50-100毫秒,我将接收转换为从列表/分类列表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");
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();