添加重复数字时,哪个数字字典集合会重新排序项目

本文关键字:数字 新排序 项目 排序 字典 添加 集合 | 更新日期: 2023-09-27 18:35:44

我的C#程序允许用户按优先级对项目进行数字排名。 我编写了一个例程,当用户修改项目的排名时,它会自动按排名重新排序项目。因此,当优先级为 3 的项目更改为 1 时,例行程序将采用前 3 个项目。以前排名 1、2 的人变成了排名 2、3。同样,当优先级 1 的项目变为优先级 3 时,排名 2、3 的项目变为 1、2。

现有集合类是否内置了此功能?如果是这样,代码示例也将不胜感激。

添加重复数字时,哪个数字字典集合会重新排序项目

C# 有一个 SortedSet<T> 集合,可以使用用户提供的自定义IComparer<T>进行排序。

但是,集合不会对集合中已有项目的更改

做出反应,即,如果您在集合中已有项目时更改项目的优先级,它不会自动上移或下移。

您需要从SortedSet<T>中删除该项目,更改其优先级,然后将其重新添加。这样,集合将把它放在新的位置,移动其他项目以适应顺序的变化:

SortedSet<Project> prioritizedProjects = new SortedSet<Project>(new CompareProjByPriority());
...
Project rePrioritize = ...;
prioritizedProjects.Remove(rePrioritize);
rePrioritize.Priority = 1;
prioritizedProjects.Add(rePrioritize);

没有内置集合可以"理解"等级的概念。但是,如果秩是连续数的虚构概念,一个简单的List<Project>就可以了:

List<Project> projects = GetProjects();
Project project = projects[2]; // grab project on rank 3 (index 2 since it's 0 based)
projects.RemoveAt(2);          // pick it up
projects.Insert(0, project);   // place the project in front of the first

这将允许用户"优先考虑"项目。

但是,如果 rank 是 Project 的属性,则需要手动更新每个受影响的元素;这不应该是内置集合的责任。

你可以扩展一些集合,例如:通用列表来做到这一点

public static bool SetValue<T>(this List<T> collection, int oldValue, int newValue)
{
    if ((Math.Min(newValue, oldValue) <= -1) ||
        (Math.Max(newValue, oldValue) > collection.Count()))
    {
        return false;
    }
    if (newValue != oldValue)
    {
        var value = collection[oldValue];
        collection.RemoveAt(oldValue);
        if (newValue == collection.Count())
        {
            collection.Add(value);
        }
        else
        {
            collection.Insert(newValue, value);
        }
    }
    return true;
}

之后,您可以执行以下操作:

        var items = new List<char> { 'A', 'B', 'C' };
        var start = string.Join(", ", items); //"A, B, C"
        items.SetValue(2, 0);
        var result = string.Join(", ", items); //"C, A, B"
它是 2, 0 而不是

3, 1,因为第一个元素是 0 而不是 1。