我有一组(总共)类为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/