我的程序允许服务器将模块发送给客户端,客户端将在加载模块后返回模块信息.服务器存储将客户端信息存储在一个名为‘loadingModules’的列表中.当服务器从客户端接收到该响应时,它将从所述列表中移除指示该模块的加载操作已经完成的信息.

这里的问题是,我目前使用的方法是遍历整个列表并判断两个成员是否相等(模块名称和时间戳).这不仅效率低下,还会使代码看起来很糟糕.I am wondering if there is some way to do it using a hash of those two members to access the modules in perhaps a dictionary instead of what I am currently doing.

public List<ClientModule> LoadingClientModules = new();
public List<ClientModule> LoadedClientModules = new();

private void ClientModuleAdded_Callback(Packet packet)
{
    ClientModule f = Utils.ByteArrayToStructure<ClientModule>(packet.Payload, 0);
    Utils.Log.Information($"{_ClientInformation.ComputerUser} Loaded  {f.ModuleName} TimeDateStamp: {f.TimeDateStamp} Address: {f.Address}");
    LoadedClientModules.Add(f);

    LoadingClientModules.RemoveAll(i => i.ModuleName == f.ModuleName && i.TimeDateStamp == f.TimeDateStamp);

    OnClientModuleLoaded?.Invoke(this, f);
}

推荐答案

您可以提供一个自定义IEqualityComparter<ClientModule>来比较这两个属性.然后你可以把它用在Dictionary或-更好的这里-HashSet<ClientModule>:

public HashSet<ClientModule> LoadingClientModules = new(new ClientModuleComparer());
public HashSet<ClientModule> LoadedClientModules = new(new ClientModuleComparer());

private void ClientModuleAdded_Callback(Packet packet)
{
    ClientModule f = Utils.ByteArrayToStructure<ClientModule>(packet.Payload, 0);
    LoadedClientModules.Add(f);
    LoadingClientModules.Remove(f);
}

以下是一种可能的实现:

public class ClientModuleComparer : IEqualityComparer<ClientModule>
{
    public bool Equals(ClientModule? x, ClientModule? y)
    {
        if (x == null && y == null) return true;
        if (x == null || y == null) return false;
        return x.ModuleName == y.ModuleName && y.TimeDateStamp == y.TimeDateStamp;
    }

    public int GetHashCode([DisallowNull] ClientModule obj)
    {
        unchecked // Overflow is fine, just wrap
        {
            int hash = 17;
            // Suitable nullity checks etc, of course :)
            hash = hash * 23 + obj.ModuleName.GetHashCode();
            hash = hash * 23 + obj.TimeDateStamp.GetHashCode();
            return hash;
        }
    }
}

请注意,这不再允许重复.因此,在这些集合中不会有多个具有相同的模块名称和TimeDateStamp的集合.如果是重复的,则Add返回false.

Csharp相关问答推荐

ASP.NET配置kestrel以使用Windows证书存储中的HTTPS

如何通过寻找向量长度来优化两个循环?

Swagger没有显示int?可以为空

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

在ASP.NET Core 8 MVC中本地化共享视图

将FileStream的特定部分作为字节数组读取

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

基于C#方法的EF核心过滤查询(缓冲与流)

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

除非首先访问使用的终结点,否则本地API上的终结点不起作用

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

分别切换用于读取和写入的EF核心日志(log)

不寻常的C#语法

自定义C#链接调用未按预期运行

从C#程序可靠地运行Mercurial&S和HG状态

代码清理在插入的字符串中添加空格

基于WPF列表的控件是否支持双向绑定Realm dotnet实时查询?

如何在创建类列表之前草签该类

泛型类型BoundedComponent struct