我正在嘗試構建訂閱列表。讓我們的例子:出版商訂閱的線程安全列表的最佳數據結構?
列表,每個都具有雜誌的列表,每個都具有用戶列表
出版商 - >雜誌 - >訂閱
有道理使用字典在C#中的Dictionary中的字典中。添加/刪除沒有競爭條件的用戶時,是否可以在不鎖定整個結構的情況下執行此操作?
此外,代碼在C#中非常迅速地變得混亂,這使我認爲我不會走正確的道路。有沒有更簡單的方法來做到這一點?下面是構造函數和subscribe方法:
注:該代碼使用來源,類型,用戶不使用名字而上述
源--->類型--->用戶
public class SubscriptionCollection<SourceT, TypeT, SubscriberT>
{
// Race conditions here I'm sure! Not locking anything yet but should revisit at some point
ConcurrentDictionary<SourceT, ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>> SourceTypeSubs;
public SubscriptionCollection()
{
SourceTypeSubs = new ConcurrentDictionary<SourceT, ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>>();
}
public void Subscribe(SourceT sourceT, TypeT typeT, SubscriberT subT) {
ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>> typesANDsubs;
if (SourceTypeSubs.TryGetValue(sourceT, out typesANDsubs))
{
ConcurrentDictionary<SubscriberT, SubscriptionInfo> subs;
if (typesANDsubs.TryGetValue(typeT, out subs))
{
SubscriptionInfo subInfo;
if (subs.TryGetValue(subT, out subInfo))
{
// Subscription already exists - do nothing
}
else
{
subs.TryAdd(subT, new SubscriptionInfo());
}
}
else
{
// This type does not exist - first add type, then subscription
var newType = new ConcurrentDictionary<SubscriberT, SubscriptionInfo>();
newType.TryAdd(subT, new SubscriptionInfo());
typesANDsubs.TryAdd(typeT, newType);
}
}
else
{
// this source does not exist - first add source, then type, then subscriptions
var newSource = new ConcurrentDictionary<TypeT, ConcurrentDictionary<SubscriberT, SubscriptionInfo>>();
var newType = new ConcurrentDictionary<SubscriberT, SubscriptionInfo>();
newType.TryAdd(subT, new SubscriptionInfo());
newSource.TryAdd(typeT, newType);
SourceTypeSubs.TryAdd(sourceT, newSource);
};
}
是問題的C#特異的,或者是你尋找一個可以在任何地方使用的方法嗎? – svick
任何地方真的..然後我可以適應它C# –
我問,因爲如果問題是特定於C#,那麼有直接在.Net框架中的類,您可以使用。 – svick