Как записать значения в строку, а затем вернуть? - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть таймер, который перебирает следующий код каждую секунду.этот код читает несколько фрагментов XML один за другим, затем выводит их на экран, а затем повторяет это через секунду.output:

34,
23,
12,

Я хочу сделать так, чтобы все данные записывались в строку типа 34,23,12, а затем возвращала ее, чтобы другой класс мог ее использовать.Но если я помещу его (строковый код, вы увидите его ниже) в код if (fragmentReader.Read()), он не будет работать, поскольку он просто делает то же самое, что и console.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());
                            }
                        }
                    }
                }                
            }
        }
    }

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Проблема в том, что на каждой итерации цикла вы создаете новый объект 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());
1 голос
/ 07 сентября 2011

Попробуйте переместить вызовы 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());
}        
1 голос
/ 07 сентября 2011

Похоже, ваш 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")) 
    { ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...