c# - 从列表中删除重复项并根据项目的初始位置创建一个新列表

标签 c# algorithm list math

我有一个包含 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(){ ... }

有了这样的数组,像 PositionWeight 这样的上下文在每个 SkillViewModel 本身中可能是完全未知的,它可能只包含属性名称:

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

当然可以在 List 对象而不是数组中创建类似的结构,但我认为您明白上下文是在 SkillViewModel 之外确定的,不再需要作为属性里面。


另一种方法具有我在第一句中所写的相同缺点,但允许更多细节:您可以添加属性 position:

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

像这样PositionWeight在代码中从物理位置解开,也可以像另一个对象一样得到相同的值。

编辑:
也许你已经忘记了元素的排序是如此重要和决定性的想法。为每个对象分配所需的/必需的值,并根据权重或位置对它们进行排序,您可以使用不同的方法来排序和创建 View

关于c# - 从列表中删除重复项并根据项目的初始位置创建一个新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770735/

相关文章:

c# - 如何将多个数据表导出到单个 Excel 文件中的多个工作表

对排名结果进行元排名的算法

java - 解析一棵知道叶节点的所有父节点和祖先节点的树

将任意大小的字符串转换为任意精度的整数(bigint)

Java:最好将实体中的列表初始化为空列表或空列表

c# - 数据表 - 对一行中的每个单元格求和

c# - 如何测试自动命名状态机?

c# - 启用 https 时,应用程序设置中的连接字符串不起作用 : Azure Web App

java - 如何在迭代时从 "ConcurrentModificationException"中删除元素时避免 `ArrayList`?

android - 列表未在 android 中显示