我有一组(总共)类为OrderedObject的对象

public class OrderedObject {
    public int ord;        // ordinal number
}


它们具有ord类型的int字段,该字段对于每个对象都是唯一的,并表示其序号。但是,ord的值对于每个对象可以有所不同。我想将对象存储在Dictionary<int*, OrderedObject>中,以使键(星号代表指向int的指针,不确定如何用C#实现,但这不是我的问题)指向值的序数对象并随后者自动更改。有可能吗?

对于那些认为我的工作没什么意义的人:背景是,目前序数是一个由整数表示的自然数,但是后来它将被另一个OrderedObject代替,其中排序的工作原理与对自然数进行排序略有不同。

最佳答案

请注意,任何词典中的键都必须是唯一的,因此您将无法通过依次更改一个键来交换。在这种情况下,您必须以不同的方式实现。但是只要您始终具有唯一键,就可以执行以下操作:

class ReorderingDictionary : IDictionary<int, OrderItem>
    {

        private SortedList<int, OrderItem> sortedList = new SortedList<int, OrderItem>();

        public void Add(int key, OrderItem value)
        {
            value.IneedToBeReordered += value_IneedToBeReordered;
            sortedList.Add(key, value);
        }

        void value_IneedToBeReordered(object sender, ReOrderMeEventArgs e)
        {
            sortedList.Remove(e.OldKey);
            OrderItem item = (OrderItem)sender;
            sortedList.Add(item.Ord, item);
        }

        public bool ContainsKey(int key)
        {
            return sortedList.ContainsKey(key);
        }

        public ICollection<int> Keys
        {
            get { return sortedList.Keys; }
        }

        public bool Remove(int key)
        {
            return sortedList.Remove(key);
        }

        public bool TryGetValue(int key, out OrderItem value)
        {
            return sortedList.TryGetValue(key, out value);
        }

        public ICollection<OrderItem> Values
        {
            get { return sortedList.Values; }
        }

        public OrderItem this[int key]
        {
            get
            {
                return sortedList[key];
            }
            set
            {
                sortedList[key] = value;
            }
        }

        public void Add(KeyValuePair<int, OrderItem> item)
        {
            item.Value.IneedToBeReordered += value_IneedToBeReordered;
            sortedList.Add(item.Key, item.Value);
        }

        public void Clear()
        {
            sortedList.Clear();
        }

        public bool Contains(KeyValuePair<int, OrderItem> item)
        {
            return sortedList.ContainsKey(item.Key) && sortedList[item.Key] == item.Value;
        }

        public void CopyTo(KeyValuePair<int, OrderItem>[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public int Count
        {
            get { return sortedList.Count; }
        }

        public bool IsReadOnly
        {
            get { throw new NotImplementedException(); }
        }

        public bool Remove(KeyValuePair<int, OrderItem> item)
        {
            return sortedList.Remove(item.Key);
        }

        public IEnumerator<KeyValuePair<int, OrderItem>> GetEnumerator()
        {
            return sortedList.GetEnumerator();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return sortedList.GetEnumerator();
        }
    }


    class OrderItem
    {
        private int ord;

        public int Ord
        {
            get { return ord; }
            set
            {
                int oldKey = ord;
                ord = value;
                if (IneedToBeReordered != null)
                {
                    IneedToBeReordered(this, new ReOrderMeEventArgs(oldKey));
                }
            }
        }

        public event EventHandler<ReOrderMeEventArgs> IneedToBeReordered;
    }

    class ReOrderMeEventArgs : EventArgs
    {
        public int OldKey { get; private set; }

        public ReOrderMeEventArgs(int oldKey)
        {
            this.OldKey = oldKey;
        }
    }

关于c# - 将指针用作字典中的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27549675/

10-10 14:06