Удалите дубликаты из LIST и создайте новый список, основанный на начальной позиции элементов - PullRequest
1 голос
/ 20 апреля 2019

У меня есть список из n предметов (объектов), предметы были взвешены на основе перечисленного порядка, имея больший вес предметов, которые стоят на первом месте в списке.Некоторые из элементов дублируются, поэтому я пытаюсь оставить один единственный экземпляр этого элемента в списке и выделить его для позиции в списке на основе среднего веса, например: (ItemA_weight1 + ItemA_weight 2+ ... / Amountэлементов в списке)

Например, имея следующий список:

 skillsViewModel = new List<SkillViewModel>()
        {
            new SkillViewModel()
            {
                Name = "a",
                Weight = 6
            },

            new SkillViewModel()
            {
                Name = "b",
                Weight = 5
            },

            new SkillViewModel()
            {
                Name = "c",
                Weight = 4
            },
            new SkillViewModel()
            {
                Name = "a",
                Weight = 3
            },
            new SkillViewModel()
            {
                Name = "c",
                Weight = 2
            },
            new SkillViewModel()
            {
                Name = "e",
                Weight = 1
            }

        };

элементы "a" и "c" дублируются, поэтому мне нужно получить новый список, гдевсе элементы различны, и там, где только один элемент из дупсов существует, так что он создаст приведенный ниже список.Кстати, каждый элемент в списке имеет новый вес в зависимости от его позиции и общего количества элементов в новом списке:

Новый список:

 skillsViewModel = new List<SkillViewModel>()
        {

            new SkillViewModel()
            {
                Name = "b",
                Weight = 4
            },

            new SkillViewModel()
            {
                Name = "c",
                Weight = 3
            },
            new SkillViewModel()
            {
                Name = "a",
                Weight = 2
            },

            new SkillViewModel()
            {
                Name = "e",
                Weight = 1
            }

        };

новые позиции для "a"и" с "были рассчитаны следующим образом: сумма начальных весов и деление между количеством элементов в списке.

например:

                var averageWeight = 0;
                foreach (var d in dupes)
                {

                    averageWeight = averageWeight + d.Weight;
                }


"a" position = averageWeight = (int)Math.Ceiling((Decimal)averageWeight / 
(Decimal)skillsViewModel.Count());

a=1.5 => Таконо округляется до 2

То же самое для элемента "c" = 1 =>, поэтому позиция 1, мне нужно заполнить левые позиции в списке остальными элементами на основе его предыдущей позиции.

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

Чтохороший общий алгоритм для реализации этого поведения, я использую C #?

1 Ответ

1 голос
/ 20 апреля 2019

Ваш текущий подход имеет недостаток: свойство Weight зависит от контекста, но сам объект никогда не «знает» о своем контексте, поэтому свойство должно быть установлено извне. И второй недостаток, который вы уже упомянули: два объекта не могут иметь одинаковую позицию.

Вы можете отсортировать объекты в массиве весов:

int[] weights;

weights[1][] = new SkillViewModel(){ ... }
weights[1][] = new SkillViewModel(){ ... }

weights[2][] = new SkillViewModel(){ ... }
weights[2][] = new SkillViewModel(){ ... }

Вы все еще можете сделать массив более сложным, но детализированным, добавив также позицию в качестве ключа (извините, мой код может быть синтаксически неправильным, я не программирую на C#):

int[] weights;

int weights[1][] = position;
weights[1][1] = new SkillViewModel(){ ... }
weights[1][2] = new SkillViewModel(){ ... }

int weights[2][] = position;
weights[2][4] = new SkillViewModel(){ ... }
weights[2][3] = new SkillViewModel(){ ... }

Имея такой массив, контекст, подобный Position или Weight, может быть полностью неизвестен внутри каждого SkillViewModel и может состоять только из свойства name:

    new SkillViewModel(){
        Name = 'e';
    }

Конечно, можно создать похожую структуру в объекте List вместо массива, но я думаю, вы понимаете, что контекст определяется вне SkillViewModel s и больше не требуется как свойство внутри.


Другой подход имеет тот же недостаток, который я написал в первом предложении, но допускает дополнительные детали: вы можете добавить свойство position:

    new SkillViewModel()
    {
        Name = "e",
        Position = 1,
        Weight = 1
    }

Таким образом, Position и Weight отделены от физической позиции в коде и также могут получить те же значения, что и другой объект.

Edit:
Возможно, вам придется забыть идею о том, что сортировка элементов является настолько важной и решающей. Присвойте желаемые / требуемые значения каждому объекту, и для сортировки их по весам или положению вы можете использовать различные методы для сортировки и создания view.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...