添加重复数字时,哪个数字字典集合会重新排序项目
本文关键字:数字 新排序 项目 排序 字典 添加 集合 | 更新日期: 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。