我有一个类 Item 和一个 Items 字典。字典中的每个项目都有唯一的优先级(1 到 N)。当我从字典中删除一个项目时,所有其他优先级都会更新。我想在字典中实现一些增加/减少优先级。如果我想增加单个项目的优先级,我会与下一个较低的项目交换优先级。问题是增加项目集合的优先级

public class Item
{
    public string key;
    public string data;
    public int Priority;
}

Dictionary<string, Item> allItems = new Dictionary<string, Item>();

public void AddToQueue(Item item)
{
    item.Priority = allItems.Count + 1;
    allItems[item.key] = item;
}

public void PriorityUp(Item it)
{
    if(it.Priority <= 1)
        return;

    it.Priority--;

    foreach(var item in allItems )
        if(item.Value.Priority == it.Priority)
        {
            item.Value.Priority++;
            break;
        }
}

public void PriorityUp(IEnumerable<Item> items)
{
    //TODO
}

我有字典以便有效地找到一个项目。
提高某些项目的优先级必须改变其他项目的优先级

更清楚地说:我有 N 个项目的集合(列表、数组、字典...)我选择了字典,因为我还必须执行一些其他操作。每个项目都有一个字段优先级,具有一些唯一值 1
当我选择一些并增加/减少 P 时,我想找到所有项目的结果优先级(1 到 N)。

最佳答案

好的,引用 OP 的评论,我猜他们需要的是:

public void PriorityUp(Item it)
{
    if (DecreasePriority(it))
    {
        IncreaseOther(it.Priority, new[] { it });
    }
}

public void PriorityUp(IEnumerable<Item> items)
{
    List<int> toDecrease = new List<int>();
    foreach (var item in items)
    {
        if (DecreasePriority(item))
        {
            toDecrease.Add(item.Priority);
        }
    }

    foreach(var p in toDecrease)
    {
        IncreaseOther(p, items);
    }
}

private bool DecreasePriority(Item it)
{
    if(it.Priority <= 1)
    {
        return false;
    }

    it.Priority--;

    return true;
}

private void IncreaseOther(int priority, IEnumerable<Item> toIgnore)
{
    foreach (var item in allItems.Values.Except(toIgnore))
    {
        if (item.Priority == priority)
        {
            item.Value.Priority++;
        }
    }
}

但是我不知道这一切是为了什么。也许考虑其他答案中建议的设计。

关于c# - 具有优先级的字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18853380/

10-13 08:39