如何将值写入字符串然后返回
本文关键字:字符串 然后 返回 | 更新日期: 2023-09-27 18:07:42
我有一个计时器,每秒循环通过以下代码。这段代码一个接一个地读取一些XML片段,然后将它们打印到屏幕上,然后在一秒钟后重复这个过程。输出:
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());
}
}
}
}
}
}
}
问题是,在循环的每次迭代中,您都要创建一个新的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
循环的每次迭代,您将获得一个只有1个值的字符串(您刚刚读取的值)。
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());
}
看起来您的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"))
{ ....