string agentLogin = "John";
IAgent agent = agents[agentLogin];
有没有办法让这个索引器不区分大小写?
我知道像 LinQ 这样的东西可以轻松解决这个问题,但我需要索引器来提高性能。
agents 类型是具有此属性的接口:
IAgent this[string agentLogin] {get;}
和实施:
Public IAgent this [string login]{ get { return agents[login]; }}
对于接口,您无法显式指定索引器区分大小写。您可以发表评论,仅此而已。
但是对于接口的具体实现(在实现该接口的类中),您绝对可以轻松地以不区分大小写的方式实现索引器。
但是,如果其他人将创建另一个实现相同接口的类,则此类类的实现可能会区分大小写,并且您(在接口级别)无法阻止这种情况。
因此,示例实现可能如下
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
转换为小写,然后比较并选择匹配。