У меня есть список из 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 #?