Nano Hash - криптовалюты, майнинг, программирование

LINQ to XML с использованием объединений

У меня есть файл XML в следующем формате, где action type=0 - настройки по умолчанию.

Типы действий 1 и 2 являются переопределенными настройками. Поэтому всякий раз, когда в XML доступны настройки типа 1 или типа 2, они должны переопределять настройки по умолчанию.

Чтобы переопределить идентификатор поля по умолчанию type = 0, я пытаюсь выполнить соединение с идентификатором поля override type = 1, чтобы я мог получить значения type = 1 и использовать их в своем приложении. Однако соединение, похоже, не работает. Есть ли лучший способ изменить значения по умолчанию?

Тип = 0 доступен всегда, но будет передан либо Тип = 1, либо Тип = 2.

Есть ли другой способ сделать это с помощью отражения?

XML

<ActionTypes>
    <ActionType Type="0">
        <Field Id="Label1" Name="StartDate" ComparePreviousYear="False" CompareCurrentYear="True"></Field>
        <Field Id="Label2" Name="EndDate" ComparePreviousYear="False" CompareCurrentYear="True"></Field>
        <Field Id="Label3" Name="Cost" ComparePreviousYear="True" CompareCurrentYear="False"></Field>
        <Field Id="Label4" Name="Total" ComparePreviousYear="False" CompareCurrentYear="False"></Field>
    </ActionType>
    <ActionType Type="1">
        <Field Id="Label3" Name="Cost" ComparePreviousYear="True" CompareCurrentYear="True"></Field>
    </ActionType>
    <ActionType Type="2">
        <Field Id="Label2" Name="EndDate" ComparePreviousYear="True" CompareCurrentYear="True"></Field>
    </ActionType>
</ActionTypes>

Код

IEnumerable<XElement> defaultFields = from test in defaultElements.Elements()
                                        where test.Attribute("Type").Value == "0"
                                        select test;

IEnumerable<XElement> overrideFields = from test in defaultElements.Elements()
                                         where test.Attribute("Type").Value == "1"
                                         select test;

var overrideFields = from dflt in dftElements.Elements("Field")
                       join ovrd in ovrElements.Elements("Field") on dflt.Attributes("Id") equals ovrd.Attributes("Id")
                       select dflt,ovrd;
21.06.2010

  • Несвязанный совет: вам не нужно .Value в .Attribute(...).Value во всех ваших сравнениях. Attribute(...) вернет значение типа XAttribute, и последний имеет набор операторов неявного преобразования, в том числе в string - поскольку вы используете строковые литералы справа от ==, это преобразование будет использоваться. Преимущество, помимо того, что они короче, также заключается в том, что операторы преобразования также будут работать с (XAttribute)null, производя (string)null, с которым вы можете сравнивать (или игнорировать) - при использовании .Value будет генерироваться NullReferenceException. 21.06.2010
  • @Pavel: Все преобразования из XAttribute явные, не так ли? 21.06.2010
  • @Jon: действительно, и я больше не могу редактировать комментарий, чтобы исправить это :( так что там должно быть приведение (string). Тем не менее, основная мысль все еще остается в силе (что использование преобразований заботится о нулях гораздо более кратким образом). 21.06.2010
  • @Pavel: Да, я полностью согласен с этой частью :) 21.06.2010

Ответы:


1

Здесь следует использовать Attribute, а не Attributes:

join ovrd in ovrElements.Elements("Field")
    on dflt.Attributes("Id") equals ovrd.Attributes("Id")

Как бы то ни было, вы сравниваете два IEnumerable<XAttribute> на равенство, при этом будет использоваться простое сравнение ссылок - что никогда не будет правдой.

21.06.2010
  • Спасибо за советы и объяснения. 21.06.2010

  • 2

    Кажется, это сработает, если я правильно понял ваше требование

       class Program
        {
            static void Main(string[] args)
            {
                XDocument xd = XDocument.Load("Test.xml");
                var defaultElements = xd.Document.Element("ActionTypes");
    
    
                IEnumerable<XElement> defaultFields = from test in defaultElements.Elements()
                                                      where test.Attribute("Type").Value == "0"
                                                      select test;
    
                IEnumerable<XElement> overrideFields = from test in defaultElements.Elements()
                                                       where test.Attribute("Type").Value == "1"
                                                       select test;
    
                var ovFields = from dflt in defaultFields.Elements("Field")
                               join x in overrideFields.Elements("Field") on dflt.Attribute("Id").Value equals x.Attribute("Id").Value
                               into g
                               from ovrd in g.DefaultIfEmpty()
                               select (ovrd == null ? dflt : ovrd);
                foreach (var x in ovFields.SelectMany(y=>y.Attributes()))
                    Console.WriteLine("{0}           {1}", x.Name, x.Value);
    
                Console.ReadLine();
    
            }
    
    
    
        }
    
    21.06.2010
  • Спасибо, ваше предложение с использованием левого соединения сработало отлично! 21.06.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..