gpt4 book ai didi

c# - 带可更换元素的 key 系列

转载 作者:太空狗 更新时间:2023-10-29 22:52:48 24 4
gpt4 key购买 nike

到目前为止,我一直在使用 KeyedCollection 创建一个大型对象集合(接近 100 万个),每个对象都有一个 uint ID 字段作为集合的键。这很好,但现在我在扩展功能时遇到了问题:我有“覆盖”记录,需要用新项目替换任何具有相同 key 的现有项目。平均而言,大约每 20 条记录中就有 1 条可能被覆盖,可以想象,对于同一条记录甚至多次覆盖。

如有必要,我不介意重构 KeyedCollection。我最好的选择是什么?词典<>? ID 不是连续的,因此直接索引已过时。

最佳答案

这是一个老问题,我以前自己也使用过现有的答案。但是在再次使用 KeyedCollection<> 时,我意识到先删除后添加技术的效率低于我现在实现的技术。问题在于 Remove() 方法线性搜索列表,然后将列表的其余部分向左移动一个条目。我在这里介绍的技术也线性搜索列表,但至少它避免了移动列表的其余部分。

注意。这仅适用于替换项与要替换的项具有相同 key 的情况。

   /// <summary>
/// Derived (but still abstract) version of KeyedCollection{} to provide a couple of extra
/// services, in particular AddOrReplace() and Replace() methods.
/// </summary>
public abstract class KeyedList<TKey, TItem> : KeyedCollection<TKey, TItem>
{
/// <summary>
/// Property to provide access to the "hidden" List{} in the base class.
/// </summary>
public List<TItem> BaseList
{
get { return base.Items as List<TItem>; }
}


/// <summary>
/// Method to add a new object to the collection, or to replace an existing one if there is
/// already an object with the same key in the collection.
/// </summary>
public void AddOrReplace(TItem newObject)
{
int i = GetItemIndex(newObject);
if (i != -1)
base.SetItem(i, newObject);
else
base.Add(newObject);
}


/// <summary>
/// Method to replace an existing object in the collection, i.e., an object with the same key.
/// An exception is thrown if there is no existing object with the same key.
/// </summary>
public void Replace(TItem newObject)
{
int i = GetItemIndex(newObject);
if (i != -1)
base.SetItem(i, newObject);
else
throw new Exception("Object to be replaced not found in collection.");
}


/// <summary>
/// Method to get the index into the List{} in the base collection for an item that may or may
/// not be in the collection. Returns -1 if not found.
/// </summary>
private int GetItemIndex(TItem itemToFind)
{
TKey keyToFind = GetKeyForItem(itemToFind);
return BaseList.FindIndex((TItem existingItem) =>
GetKeyForItem(existingItem).Equals(keyToFind));
}
}

关于c# - 带可更换元素的 key 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13560898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com