gpt4 book ai didi

c# - 为什么 ConcurrentBag 不实现 ICollection

转载 作者:IT王子 更新时间:2023-10-29 04:16:15 28 4
gpt4 key购买 nike

我有一个方法接受 IList<> 并向其添加内容。我想把它传给 ConcurrentBag在某些情况下,但它不实现 IList<> 或 ICollection<>,仅实现非通用 ICollection ,它没有 Add 方法。

现在,我明白了为什么它不能(也许)实现 IList - 它不是一个有序的集合,所以它没有索引器。但我没有发现任何 ICollection<> 的问题。方法。

那么,为什么?而且,还有 - .NET 中是否有一个线程安全的集合可以实现更强大的接口(interface)?

最佳答案

A List<T>不是并发的,所以它可以实现 ICollection<T>这给了你一对方法 ContainsAdd .如果Contains返回 false你可以安全地调用Add知道它会成功。

A ConcurrentBag<T>是并发的,所以它不能实现 ICollection<T>因为答案Contains当您调用 Add 时,返回可能无效.相反,它实现了 IProducerConsumerCollection<T>它提供单一方法 TryAdd这两个Contains的工作和 Add .

不幸的是,您希望对同为集合但不共享公共(public)接口(interface)的两个事物进行操作。有很多方法可以解决这个问题,但当 API 与这些相似时,我的首选方法是为两个接口(interface)提供方法重载,然后使用 lambda 表达式来制作委托(delegate),这些委托(delegate)使用它们自己的方法为每个接口(interface)执行相同的操作。然后,您可以使用该委托(delegate)代替执行几乎常见操作的位置。

这是一个简单的例子:

public class Processor
{
/// <summary>
/// Process a traditional collection.
/// </summary>
/// <param name="collection">The collection.</param>
public void Process(ICollection<string> collection)
{
Process(item =>
{
if (collection.Contains(item))
return false;
collection.Add(item);
return true;
});
}

/// <summary>
/// Process a concurrent collection.
/// </summary>
/// <param name="collection">The collection.</param>
public void Process(IProducerConsumerCollection<string> collection)
{
Process(item => collection.TryAdd(item));
}

/// <summary>
/// Common processing.
/// </summary>
/// <param name="addFunc">A func to add the item to a collection</param>
private void Process(Func<string, bool> addFunc)
{
var item = "new item";
if (!addFunc(item))
throw new InvalidOperationException("duplicate item");
}
}

关于c# - 为什么 ConcurrentBag<T> 不实现 ICollection<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5611781/

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