Создать список, ссылающийся на объект в другом списке - PullRequest
0 голосов
/ 05 июня 2018

используя c # Я прочитал XML-файл в XML-документ и использую XPath для получения списка XMLNodes в списке кодов XMLNodeList.Я хочу создать отдельный список пустых кодов, который имеет ссылку на любые XmlNodes в списке кодов, которые соответствуют критериям.

, поэтому мой текущий код, который создает список интересующих XmlNodes, выглядит следующим образом.

XmlDocument xDoc = new XmlDocument();
xDoc.Load("C:\\Test.XML");

List<int> blankCodes = new List<int>();

XmlNodeList codeList = xDoc.SelectNodes("codelist\\Code");
foreach( XmlNode aNode in codeList)
{
  if(aNode.Value == "")
  {
    blankCodes.Add( (int)aNode.Attributes("Index")
  }
}

Затем я переберу целые числа в списке blankCodes, снова найду соответствующий узел в codeList и изменю другое значение в узле.

возможно ли по существу создать список указателей насоответствующие XmlNodes в codeList?тогда вместо того, чтобы искать XmlNodes в codeList с помощью xPath или проходить циклически, я могу напрямую ссылаться на XmlNode?

Я более чем рад попытаться дать разъяснение, если вы можете дать рекомендации о том, что нужно прояснить.

Большое спасибо bommelding.

------ Демонстрационный код рабочего ответа ниже -----------------

using System;
using System.Collections.Generic;

namespace TestReferences
{
    /// <summary>
    /// Basic Class to with index and value
    /// </summary>
    class aVal
    {
        public int Index { get; set; }
        public int Value { get; set; }
    }

    class Program
    {

        static void Main(string[] args)
        {
            //Create two lists of class to simulate XML node
            List<aVal> originalList = new List<aVal>(); //Proper list as if read from XML
            List<aVal> blankList = new List<aVal>(); //List of Blank Codes

            //Loop to create 20 instances of class
            for(int i = 1; i <= 20; i++)
            {
                //Create class
                aVal temp = new aVal();
                temp.Index = i; //Index 
                temp.Value = i * 2; //Easily Identifiable Value

                originalList.Add(temp); //Add to original list

                if( i == 4 || i==12 || i == 18) //Simulate Blank Codes
                {
                    blankList.Add(originalList[originalList.IndexOf(temp)]); //Add the instance to blank list so we get a reference, 
                    //I presume that I have to add the one in the list not the temporary instance used to populate the original list
                }

            }

            //Write the original list to the console
            //Expected output "Index 1 : Val 2"
            Console.WriteLine("******* Original List ***************");
            foreach( aVal te in originalList)
            {
                Console.WriteLine("Index {0} : Val {1}", te.Index, te.Value);
            }

            //Write the blank list to the console.

            Console.WriteLine("******* Blank List ***************");
            foreach (aVal te in blankList)
            {
                Console.WriteLine("Index {0} : Val {1}", te.Index, te.Value);
            }

            Console.WriteLine("*****************");
            Console.WriteLine("Modifying Blanks");
            Console.WriteLine("*****************");

            //Set each instance.value to -99 referenced by the blanklist
            foreach (aVal te in blankList)
            {
                te.Value = -99;
            }

            //Check the output, 4,12,18 should have value -99
            Console.WriteLine("******* Original List after blanks modified ***************");
            foreach (aVal te in originalList)
            {
                Console.WriteLine("Index {0} : Val {1}", te.Index, te.Value);
            }

            Console.ReadLine();
        }
    }
}

1 Ответ

0 голосов
/ 05 июня 2018

Да, потому что XmlNodes - это обычные объекты C #.Вы всегда работаете с (через) ссылку.

Создание копии экземпляра - это намного больше работы, особенно для семейства XmlDocument.

List<XmlNode> blankCodes = new List<XmlNode>();


  if(aNode.Value == "")
  {
     blankCodes.Add(aNode);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...