如何在指定索引处插入 ConcurrentBag 并保留所有值?
How to Insert in ConcurrentBag at specified Index and retaining all values?
我想获得与 List.Insert(Index, content ) 相同的行为
在 List 中,它只是将其余元素向前推,同时使您能够在指定索引处插入新元素。
但我正在处理并发,所以我不能再使用列表,而是需要使用并发集合。知道我们如何实现这一目标吗?
注:
我正在尝试对存储在并发集合中的自定义对象进行自定义排序(即如果在索引 = 2 处,姓氏按字母顺序小于传入的姓氏,它必须允许传入的放置在索引 = 2 处, 同时将旧值推送/滑动到下一个索引。因此保留所有内容和新值)
ConcurrentBag<T>
没有提供您正在寻找的功能。这不是一个列表,它是一个包。您无法控制其内容的顺序,甚至无法从此集合中删除特定项目。您所能做的就是 Add
或 Take
一个项目。
任何并发集合都没有提供您正在寻找的丰富功能。您最好的选择可能是使用受 lock
保护的普通 List<T>
。只要确保您永远不会触摸受保护区域之外的 List<T>
即可。无论你需要Add
,或Insert
,或Remove
,或枚举,或阅读一个项目,或阅读Count
,或任何其他事情,你必须始终这样做在用同一对象锁定的 lock
区域内。
附带说明一下,您尝试做的事情很可能从根本上是错误的。您要求的功能不可用是有原因的:如果不引入 race-conditions,几乎不可能以有意义的方式使用它。例如,两个线程可以根据列表中的现有值独立地确定他们必须在索引 5 中插入一个新项目,然后都尝试同时将其插入到该索引处。两者都会成功,但是这两个项目中的一个在被另一个项目推送后将 end-up 在索引 6 中,并且这两个项目相对于彼此的顺序可能不正确。
我想获得与 List.Insert(Index, content ) 相同的行为 在 List 中,它只是将其余元素向前推,同时使您能够在指定索引处插入新元素。
但我正在处理并发,所以我不能再使用列表,而是需要使用并发集合。知道我们如何实现这一目标吗?
注:
我正在尝试对存储在并发集合中的自定义对象进行自定义排序(即如果在索引 = 2 处,姓氏按字母顺序小于传入的姓氏,它必须允许传入的放置在索引 = 2 处, 同时将旧值推送/滑动到下一个索引。因此保留所有内容和新值)
ConcurrentBag<T>
没有提供您正在寻找的功能。这不是一个列表,它是一个包。您无法控制其内容的顺序,甚至无法从此集合中删除特定项目。您所能做的就是 Add
或 Take
一个项目。
任何并发集合都没有提供您正在寻找的丰富功能。您最好的选择可能是使用受 lock
保护的普通 List<T>
。只要确保您永远不会触摸受保护区域之外的 List<T>
即可。无论你需要Add
,或Insert
,或Remove
,或枚举,或阅读一个项目,或阅读Count
,或任何其他事情,你必须始终这样做在用同一对象锁定的 lock
区域内。
附带说明一下,您尝试做的事情很可能从根本上是错误的。您要求的功能不可用是有原因的:如果不引入 race-conditions,几乎不可能以有意义的方式使用它。例如,两个线程可以根据列表中的现有值独立地确定他们必须在索引 5 中插入一个新项目,然后都尝试同时将其插入到该索引处。两者都会成功,但是这两个项目中的一个在被另一个项目推送后将 end-up 在索引 6 中,并且这两个项目相对于彼此的顺序可能不正确。