如何使索引器不区分大小写

问题描述 投票:0回答:1
string agentLogin = "John";
IAgent agent = agents[agentLogin];

有没有办法让这个索引器不区分大小写?

我知道像 LinQ 这样的东西可以轻松解决这个问题,但我需要索引器来提高性能。

agents 类型是具有此属性的接口:

IAgent this[string agentLogin] {get;}

和实施:

Public IAgent this [string login]{ get { return agents[login]; }}
c# indexing case-insensitive
1个回答
0
投票

对于接口,您无法显式指定索引器区分大小写。您可以发表评论,仅此而已。

但是对于接口的具体实现(在实现该接口的类中),您绝对可以轻松地以不区分大小写的方式实现索引器。

但是,如果其他人将创建另一个实现相同接口的类,则此类类的实现可能会区分大小写,并且您(在接口级别)无法阻止这种情况。

因此,示例实现可能如下

interface IAgent
{
    string Login { get; }
}

public class Agent : IAgent
{
    public string Login { get; }
    public Agent(string login) => Login = login;
}

interface IAgentsManager
{
    IAgent this[string agentLogin] { get; }

    void Add(IAgent agent);
}

class AgentsManager : IAgentsManager
{
    private Dictionary<string, IAgent> agents = new();

    public IAgent this[string agentLogin]
    {
        get => agents[agentLogin.ToLowerInvariant()];
        set => agents[agentLogin.ToLowerInvariant()] = value;
    }

    public void Add(IAgent agent)
    {
        agents.Add(agent.Login.ToLowerInvariant(), agent);
    }
}


public class Program
{
    public static void Main()
    {
        IAgentsManager manager = new AgentsManager();
        manager.Add(new Agent("login"));
        manager.Add(new Agent("UPPER_LOGIN"));
        manager.Add(new Agent("MixedLogin"));

        //will throw "An item with the same key has already been added"
        //manager.Add(new Agent("mixedLogin"));

        Console.WriteLine(manager["login"].Login); //login
        Console.WriteLine(manager["LoGin"].Login); //login
        Console.WriteLine(manager["upper_Login"].Login); //UPPER_LOGIN
        Console.WriteLine(manager["MixedLogin"].Login); //MixedLogin
        Console.WriteLine(manager["mixedlogin"].Login); //MixedLogin
    }
}

此实现提供类似字典的接口,其中字典键始终存储为小写,索引器也会在字典中搜索之前将

login
参数转换为小写。

您绝对可以更改存储类型和整个内部逻辑,但想法非常简单 - 将索引器的

login
参数转换为小写,将所有已知的
IAgent.Login
转换为小写,然后比较并选择匹配。

© www.soinside.com 2019 - 2024. All rights reserved.