Информация об изменениях

Сообщение Re: Один запрос для разных полей от 20.12.2023 18:06

Изменено 21.12.2023 11:15 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒

Re: Один запрос для разных полей
никак. тебе надо найти айтемы, имеющие более одного неуникального значения по какому то из уникальных атрибутов, верно? код очень тяжело передает твои намерения. гораздо читабельнее было бы завести словарь Dictionary<string, object> и один раз пробежаться по коллекции с проверкой значений уникальных атрибитов по тому словарю попутно заполняя словарь. Обрати внимание на важность спртировки. Твой подход дискредиторует линк как технологию, кто то может посмотреть на это все ужаснуться и больше никогда к нему не прикасаться.
Re: Один запрос для разных полей
никак. тебе надо найти айтемы, имеющие более одного неуникального значения по какому то из уникальных атрибутов, верно? код очень тяжело передает твои намерения. гораздо читабельнее было бы завести словарь Dictionary<string, object> и один раз пробежаться по коллекции с проверкой значений уникальных атрибитов по тому словарю попутно заполняя словарь. Обрати внимание на важность спртировки. Твой подход дискредиторует линк как технологию, кто то может посмотреть на это все ужаснуться и больше никогда к нему не прикасаться.

на быструю примерно так.

namespace HelloWorld
{
    class Hello
    {
        enum Attribute
        {
            Age, Name
        }

        static void Main()
        {
            var people = new List<Person>() {
                new () { Id = 1, Age = 3, Name = "vova" },
                new () { Id = 1, Age = 31, Name = "vova" },
                new () { Id = 2, Age = 32, Name = "vova2" },
                new () { Id = 2, Age = 33, Name = "vova2" },
                new () { Id = 4, Age = 323, Name = "vova24" },
                new () { Id = 4, Age = 323, Name = "vova25" }
            };

            List<(int, Attribute, object, object)> Validate(Person person, Dictionary<int, Dictionary<Attribute, object>> processedPeople)
            {
                object GetValue(Person person, Attribute attribute) =>
                   attribute switch
                   {
                       Attribute.Age => person.Age,
                       Attribute.Name => person.Name,
                       _ => throw new ArgumentException($"Invalid attribute: '{attribute}'"),
                   };

                var errors = new List<(int, Attribute, object, object)>();

                foreach (var attribute 
                    in Enum.GetValues<Attribute>())
                {
                    if (!processedPeople.TryGetValue(person.Id,
                        out var processedPerson))
                    {
                        processedPerson = new();
                        processedPeople.Add(person.Id, processedPerson);
                    }

                    if (!processedPerson.TryGetValue(attribute, out var originalValue))
                    {
                        originalValue = GetValue(person, attribute);
                        processedPerson.Add(attribute, originalValue);
                    }
                    else
                    {
                        var value = GetValue(person, attribute);
                        if (originalValue != value)
                        {
                            errors.Add(new(person.Id, attribute, value, originalValue));
                        }
                    }
                }

                return errors;
            }

            var processedPeople = new Dictionary<int, Dictionary<Attribute, object>>(); // note: mutable state
            foreach ((int id, Attribute attribute, object value, object originalValue) 
                in people.SelectMany(person => Validate(person, processedPeople)))
            {
                Console.WriteLine($"Person Id: {id} '{attribute}' value specified ambiguously, value: '{value}', original value: '{originalValue}'");
            }

            Console.ReadLine();
        }

        class Person
        {
            public int Id;
            public required string Name { get; set; }
            public int Age { get; set; }
        }
    }
}