我有一个包含 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”和“c”的新位置是这样计算的: 初始权重之和除以列表中的项目数量。
例如:
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#?
最佳答案
您当前的方法有一个缺点,即属性 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
本身中可能是完全未知的,它可能只包含属性名称
:
new SkillViewModel(){
Name = 'e';
}
当然可以在 List 对象而不是数组中创建类似的结构,但我认为您明白上下文是在 SkillViewModel
之外确定的,不再需要作为属性里面。
另一种方法具有我在第一句中所写的相同缺点,但允许更多细节:您可以添加属性 position
:
new SkillViewModel()
{
Name = "e",
Position = 1,
Weight = 1
}
像这样Position
和Weight
在代码中从物理位置解开,也可以像另一个对象一样得到相同的值。
编辑:
也许你已经忘记了元素的排序是如此重要和决定性的想法。为每个对象分配所需的/必需的值,并根据权重或位置对它们进行排序,您可以使用不同的方法来排序和创建 View
。
关于c# - 从列表中删除重复项并根据项目的初始位置创建一个新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770735/