Re: Один запрос для разных полей
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 20.12.23 18:06
Оценка: +1
никак. тебе надо найти айтемы, имеющие более одного неуникального значения по какому то из уникальных атрибутов, верно? код очень тяжело передает твои намерения. гораздо читабельнее было бы завести словарь Dictionary<string, object> и один раз пробежаться по коллекции с проверкой значений уникальных атрибитов по тому словарю попутно заполняя словарь. Обрати внимание на важность спртировки. Твой подход дискредиторует линк как технологию, кто то может посмотреть на это все ужаснуться и больше никогда к нему не прикасаться.

на быструю примерно так, добавил ref.

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, ref 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, ref 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; }
        }
    }
}
Отредактировано 21.12.2023 11:20 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒ . Предыдущая версия . Еще …
Отредактировано 21.12.2023 11:15 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.