我有一个正在处理的项目,需要更改“BaseSortedCollection”类以允许重复。该类当前实现 IEnumerable、IDisposable、ICollection 和 ISerializable。'BaseSortedCollection' 存储具有 ItemID (Int64) 的项目,该项目在访问集合时用作键。我需要同时在集合中存在两个相同的项目(相同的 ItemID)并且能够被检索。
我们使用的是 2.0 框架。
有什么建议么?
提前致谢!
我有一个正在处理的项目,需要更改“BaseSortedCollection”类以允许重复。该类当前实现 IEnumerable、IDisposable、ICollection 和 ISerializable。'BaseSortedCollection' 存储具有 ItemID (Int64) 的项目,该项目在访问集合时用作键。我需要同时在集合中存在两个相同的项目(相同的 ItemID)并且能够被检索。
我们使用的是 2.0 框架。
有什么建议么?
提前致谢!
BaseSortedCollection 中的每个项目都可以是一个 List(T),因此如果您有两个项目具有相同的键,那么您将拥有一个 List(T),其中包含与该键对应的条目的两个项目。
我假设您正在扩展一种不允许重复键的字典。
这个实现怎么样。我假设您的项目实现了 IComparable。
class BaseSortedCollection<T> : Collection<T>, ICollection<T>, IEnumerable<T>,
System.Collections.ICollection, System.Collections.IEnumerable
where T : IComparable<T>
{
/// <summary>
/// Adds an item to the Collection<T> at the correct position.
/// </summary>
/// <param name="item">The object to add to </param>
public new void Add(T item)
{
int pos = GetInsertPositio(item);
base.InsertItem(pos, item);
}
/// <summary>
/// Convinience function to add variable number of items in one Functioncall
/// </summary>
/// <param name="itemsToBeAdded">The items to be added.</param>
/// <returns>this to allow fluent interface</returns>
public AutoSortCollection<T> AddItems(params T[] itemsToBeAdded)
{
foreach (var item in itemsToBeAdded)
Add(item);
return this;
}
/// <summary>
/// Get position where item should be inserted.
/// </summary>
/// <param name="item"></param>
/// <returns>Get position where item should be inserted.</returns>
private int GetInsertPositio(T item)
{
if (item == null)
throw new ArgumentNullException();
for (int pos = this.Count - 1; pos >= 0; pos--)
{
if (item.CompareTo(this.Items[pos]) > 0)
return pos + 1;
}
return 0;
}
}
这应该工作(使用MsTest)
/// <summary>
///A test sorting for SCCPackageEx Constructor
///</summary>
[TestMethod()]
public void SortingTest()
{
BaseSortedCollection<int> collection = new BaseSortedCollection<int>().AddItems(1,5,3,2,4,0);
Assert.AreEqual(6, collection.Count, "collection.Count");
for(int i=0; i <=5; i++)
Assert.AreEqual(i, collection[i], "collection[" + i + "]");
}
我猜你将不得不扩展一个常规的 ArrayList,如果你需要自动排序,则覆盖 Add-method 来调用 Sort。但是,我似乎无法理解两个项目具有相同(应该是唯一的)标识号的想法?!
编辑,或者 NameValueCollection(在 System.Collections.Specialized 中)更合适?扩展它并添加您自己的排序方法...