C# 类型转换性能可优化?

C# 类型转换性能可优化?,c#,xml,csv,optimization,type-conversion,C#,Xml,Csv,Optimization,Type Conversion,以下代码段在数据处理应用程序中将xml数据转换为csv数据元素是一个元素。我目前正在尝试优化应用程序的性能,并想知道是否可以以某种方式将下面的两个操作结合起来:最终,我仍然希望访问joined的字符串值和列表中的值元素,因为它们稍后会用于其他目的。不确定这是否可行。任何帮助都将不胜感激 第一个操作基本上剥离所有标记的XML数据,只返回它们之间或外部的文本数据。它还检查格式。第二个操作获取XML数据,并删除数据前几个字符中的所有换行符和空格 IEnumerable<string> va

以下代码段在数据处理应用程序中将xml数据转换为csv数据<代码>元素是一个
元素
。我目前正在尝试优化应用程序的性能,并想知道是否可以以某种方式将下面的两个操作结合起来:最终,我仍然希望访问joined的字符串值和列表中的值元素,因为它们稍后会用于其他目的。不确定这是否可行。任何帮助都将不胜感激

第一个操作基本上剥离所有标记的XML数据,只返回它们之间或外部的文本数据。它还检查格式。第二个操作获取XML数据,并删除数据前几个字符中的所有换行符和空格

IEnumerable<string> values = new List<string>();
        values = element.DescendantNodes().OfType<XText>()
        .Select(v => Regex.Replace(v.Value, "\\s+", " ")).ToList();

string joined = string.Concat(element.ToString().Split().Take(3)) + string.Join(" ", element.
        ToString().Split().Skip(3));
IEnumerable values=new List();
values=element.degenantNodes().OfType()的
.Select(v=>Regex.Replace(v.Value,“\\s+”,”).ToList();
连接的字符串=string.Concat(element.ToString().Split().Take(3))+string.Join(“),元素。
ToString().Split().Skip(3));
随后:

….Select(v => Regex.Replace(v.Value, "\\s+", " ")).ToList();
你真的需要它成为一个列表吗?将速度与以下各项进行比较:

….Select(v => Regex.Replace(v.Value, "\\s+", " "));
有时这会比较慢,有时甚至不起作用,但很多时候,
ToList()
只是浪费时间和内存

string joined = string.Concat(
  element.ToString().Split().Take(3))
  + string.Join(" ", element.ToString().Split().Skip(3));
第一件事是为什么要调用
ToString()
Split()
两次

var splitOnWhiteSpace = element.ToString().Split();
string joined = string.Concat(
  splitOnWhiteSpace.Take(3))
  + string.Join(" ", splitOnWhiteSpace.Skip(3));
我们可能也可以通过自定义方法优化
连接

var elString = element.ToString();
var buffer = new StringBuilder(element.Length - 2); //Can't be larger, unlikely to be much smaller so obtain necessary space in advance.
using(var en = elString.Split().GetEnumerator())
{
  int count = 0;
  while(en.MoveNext() && ++count != 4)
    buffer.Append(en.Current);
  while(en.MoveNext())
    buffer.Append(en.Current).Append(' ');
}
string joined = buffer.ToString();

如果这个循环被几个循环击中,我会考虑在每个循环之间使用缓冲器(<代码> CULL())/代码>在每次使用之后,而不是创建一个新的缓冲区。


如果被拆分的字符串非常大,我可能会考虑一个自定义版本的 SPLIT()/>代码>,它只通过字符串发送它所需的块,而不是在每个通道中创建一个数组,但是,在我首先尝试上述更明显的改进之前,我不会担心这一点。

如果您将
XElement
方法替换为使用
XmlReader
的方法,并以流式方式执行,则GB数据的处理时间从~7分钟缩短到~6.4分钟(
在获得结果时产生返回结果)你可能会做得更好
XmlReader
使用起来更灵活,但通常更快。这是我目前使用的方法,它确实使用了
XmlReader
;在邮件中核对答案
string joined = string.Concat(
  element.ToString().Split().Take(3))
  + string.Join(" ", element.ToString().Split().Skip(3));
var splitOnWhiteSpace = element.ToString().Split();
string joined = string.Concat(
  splitOnWhiteSpace.Take(3))
  + string.Join(" ", splitOnWhiteSpace.Skip(3));
var elString = element.ToString();
var buffer = new StringBuilder(element.Length - 2); //Can't be larger, unlikely to be much smaller so obtain necessary space in advance.
using(var en = elString.Split().GetEnumerator())
{
  int count = 0;
  while(en.MoveNext() && ++count != 4)
    buffer.Append(en.Current);
  while(en.MoveNext())
    buffer.Append(en.Current).Append(' ');
}
string joined = buffer.ToString();