我的C#程序允许用户按优先级对项目进行数字排序。我已经写了一个例程,当用户修改项目的排名时,它会自动按排名重新排序项目。因此,当优先级为3的项目更改为1时,例程将重新排序前3个项目。类似地,当优先级1的项目变成优先级3,那么那些排名2,3的项目就变成了1,2。
现有的集合类是否内置了此功能?如果是这样的话,代码样本也将不胜感激。
发布于 2014-12-30 15:52:50
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);
发布于 2014-12-30 15:56:47
没有内置的集合可以“理解”排名的概念。然而,如果秩是一个连续数的虚构概念,那么一个简单的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
的属性,则需要手动更新每个受影响的元素;这不应该是内置集合的责任。
发布于 2014-12-30 16:34:52
您可以扩展一些集合,例如: generic list来完成此操作
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。
https://stackoverflow.com/questions/27708380
复制相似问题