C# 如何将值写入字符串然后返回?
我有一个计时器,每秒循环一次下面的代码。这段代码一个接一个地读取一些xml片段,然后将它们打印到屏幕上,然后在一秒钟后重复这段代码。输出:C# 如何将值写入字符串然后返回?,c#,xml,string,class,C#,Xml,String,Class,我有一个计时器,每秒循环一次下面的代码。这段代码一个接一个地读取一些xml片段,然后将它们打印到屏幕上,然后在一秒钟后重复这段代码。输出: 34, 23, 12, 我要做的是将所有数据写入一个字符串,如34,23,12,然后返回它,以便其他类可以使用它。但是如果我把它(字符串代码,你会在下面看到)放在if(fragmentReader.Read())代码下面,它不起作用,因为它只是做了与控制台相同的事情。writeline在它上面:读取一个片段,然后写入控制台,然后写入下一个片段,它不会将片段
34,
23,
12,
我要做的是将所有数据写入一个字符串,如34,23,12,然后返回它,以便其他类可以使用它。但是如果我把它(字符串代码,你会在下面看到)放在if(fragmentReader.Read())
代码下面,它不起作用,因为它只是做了与控制台相同的事情。writeline在它上面:读取一个片段,然后写入控制台,然后写入下一个片段,它不会将片段中的所有值添加到一个字符串中
谢谢
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{
using (var readerz = file.CreateViewAccessor(0, 0))
{
var bytes = new byte[195];
var encoding = Encoding.ASCII;
readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);
//File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));
StringReader stringz = new StringReader(encoding.GetString(bytes));
var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
using (var reader = XmlReader.Create(stringz, readerSettings))
{
while (reader.Read())
{
using (var fragmentReader = reader.ReadSubtree())
{
if (fragmentReader.Read())
{
reader.ReadToFollowing("value");
//Console.WriteLine(reader.ReadElementContentAsString() + ",");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(reader.ReadElementContentAsString()).Append(",");
Console.WriteLine(sb.ToString());
}
}
}
}
}
}
}
time-devent上的私有静态void(对象源,ElapsedEventArgs e)
{
使用(var file=MemoryMappedFile.OpenExisting(“AIDA64\u SensorValues”))
{
使用(var readerz=file.CreateViewAccessor(0,0))
{
var字节=新字节[195];
var encoding=encoding.ASCII;
readerz.ReadArray(0,字节,0,字节.长度);
//File.writealText(“C:\\myFile.txt”,encoding.GetString(字节));
StringReader stringz=新的StringReader(encoding.GetString(bytes));
var readerSettings=newxmlreadersettings{ConformanceLevel=ConformanceLevel.Fragment};
使用(var reader=XmlReader.Create(stringz,readerSettings))
{
while(reader.Read())
{
使用(var fragmentReader=reader.ReadSubtree())
{
if(fragmentReader.Read())
{
读者。阅读以下内容(“价值”);
//Console.WriteLine(reader.ReadElementContentAsString()+“,”);
System.Text.StringBuilder sb=新的System.Text.StringBuilder();
sb.Append(reader.ReadElementContentAsString()).Append(“,”);
Console.WriteLine(sb.ToString());
}
}
}
}
}
}
}
您的StringBuilder
sb似乎超出了范围。尝试移动它,以便在您进入例程后立即创建它。为了添加@Stephan H所说的内容,您需要在退出循环后放置WriteLine,以便获得正确的输出
static void OnTimedEvent(object source, ElapsedEventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{ ....
问题在于,在循环的每次迭代中,您都在创建一个新的stringbuilder对象。您需要在循环之前创建该对象,然后在循环之后打印字符串 你想要什么:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
while (reader.Read())
{
using (var fragmentReader = reader.ReadSubtree())
{
if (fragmentReader.Read())
{
reader.ReadToFollowing("value");
//Console.WriteLine(reader.ReadElementContentAsString() + ",");
sb.Append(reader.ReadElementContentAsString()).Append(",");
}
}
}
Console.WriteLine(sb.ToString());
尝试将
StringBuilder
和WriteLine
调用移到while循环之外。由于在循环的每次迭代中都要创建一个新的StringBuilder
,因此得到的字符串只有一个值(您刚刚读取的值)
如果将Writeline留在循环中,则输出将是34、34、23、34、23、12,这不是预期的输出。
using (var reader = XmlReader.Create(stringz, readerSettings))
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
while (reader.Read())
{
using (var fragmentReader = reader.ReadSubtree())
{
if (fragmentReader.Read())
{
reader.ReadToFollowing("value");
sb.Append(reader.ReadElementContentAsString()).Append(",");
}
}
}
Console.WriteLine(sb.ToString());
}