gpt4 book ai didi

c# - 字典列表与嵌套字典

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:48 24 4
gpt4 key购买 nike

为了解释一下我的环境,我需要跟踪用户和每个用户拥有的东西的集合。这是高度动态的,尽管基础用户的数量总是高于他们拥有的东西的数量。我决定采用这样的方法:

private static Dictionary<string, Dictionary<string, MyClass>> ActiveUsers = 
new Dictionary<string, Dictionary<string, MyClass>>();

在这种情况下,TKey父字典是用户的 connectionId,TKey对于内部字典是一个字符串,表示 MyClass 的 Id
我之前的意思是 ActiveUsers 将持有(希望)大量的 TKey,而 TValues 通常持有少于 10 个项目。由于这些项目是相关的,当用户断开连接时,它会从父词典中删除,父词典中的所有其他项目将在其内部词典中搜索某些值,如果存在则将被删除。
该字段将被不断(非常频繁)访问,我正在努力实现最佳性能。

与创建具有 ID 和 Dictionary<string, MyClass> 的类相比,这是一种更好的方法(与性能相关)吗?作为字段并保存此类的列表?
这样会更好吗?

public class ActiveUsersManager
{
public string Id{ get; private set; }
public Dictionary<string, MyClass> ActiveUsers { get; private set; }

public ActiveUsersManager(string connectionId)
{
Id = connectionId;
ActiveUsers = new Dictionary<string, MyClass>();
}
}

//In another class
private static List<ActiveUsersManager> ActiveUsers = new List<ActiveUsersManager>();

如果有帮助,ActiveUsers 是 ASP.NET Controller 中的静态字段。

编辑:回答评论

这本字典是这样消费的:

public static MyClass GetInformation(string myId, string objectId)
{
//Validation removed
Dictionary<string, MyClass> dictionaryResult = null;
MyClass result = null;

if (!ActiveUsers.TryGetValue(myId, out dictionaryResult)) //check if the user was already added to the Dictionary
{
dictionaryResult = new Dictionary<string, MyClass>();
result = new MyClass(objectId);
dictionaryResult.Add(objectId, result);
ActiveUsers.Add(myId, dictionaryResult);
}
else if (!dictionaryResult.TryGetValue(objectId, out result)) //otherwise check if the user already has this item
{
result = new MyClass(objectId);
dictionaryResult.Add(objectId, result);
ActiveUsers.Add(myId, dictionaryResult);
}
//else everything is already set-up
return result;
}

编辑:显示内部项目如何删除的代码

public static void RemoveUserAndSessions(string userId, string objectId)
{
ActiveUsers.Remove(userId);
foreach (Dictionary<string, MyClass> dic in ActiveUsers.Values)
dic.Remove(objectId);
}

这是我工作的第一个 ASP.NET 应用程序,我以前没有做过任何涉及字典的多线程,我怎样才能使这个线程安全?

编辑:试图让事情更清楚。

我不想透露细节,但我想他们需要了解这背后的原因。这是一个聊天应用程序。每个用户都存储在 ActiveUsers 中以跟踪活跃用户。每个用户都有一个与他们连接的客户端的字典,而 MyClass 对象包含客户端通信所需的一组属性。一旦用户断开连接,必须立即删除所有事件 session ,因此使用 delete 方法。我想这可以通过创建另一个类来在字典中保存事件 session 并在原始字典中包含此类来完成。
按照建议,我将看一下 ConcurrentDictionary

最佳答案

我强烈建议像这样构造数据:

private static ConcurrentDictionary<string, ActiveUser> ActiveUsers { get; set; }

private class ActiveUser {
public int ConnectionId { get; set; }
public Dictionary<string, MyClass> MyClasses { get; set; } = new Dictionary<string, MyClass>();
}
// . . .
Dictionary<string, ActiveUser> ActiveUsers = new Dictionary<string, ActiveUser>();

(注意:如果您使用的是 C# < 6,只需在 ActiveUser 构造函数中初始化字典即可)

对于您的删除方法,您可能需要执行以下操作:

public static void RemoveUserAndSessions(string userId, string objectId)
{
ActiveUsers.Remove(userId);
Parallel.ForEach(ActiveUsers.Values, dic => dic.Remove(objectId));
}

编辑:为清楚起见重命名了一些东西。

关于c# - 字典列表与嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530624/

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