C#将多个键映射到一个值
问题描述:
我正在寻找一个可以将多个键映射到单个对象的C#容器。例如:一个人可以用他的英文名称或他的西班牙文名称来引用。我想这样做,以便我不必创建多个字典副本,并且当我从结构中添加/删除时,我只需添加/删除一次。这样的结构是否存在?C#将多个键映射到一个值
答
没有理由为什么你不能与多个键添加一个对象实例:
public class Person
{
public string EnglishName { get; set; }
public string SpanishName { get; set; }
}
public static class PersonDictExtensions
{
public static void AddPerson(this IDictionary<string, Person> persons, Person person)
{
persons.Add(person.EnglishName, person);
persons.Add(person.SpanishName, person);
}
public static void RemovePerson(this IDictionary<string, Person> persons, Person person)
{
foreach (var item in persons.Where(x => object.ReferenceEquals(x.Value, person)).ToList())
{
persons.Remove(item.Key);
}
}
}
var person = new Person { EnglishName = "Foo", SpanishName = "Bar" };
var dict = new Dictionary<string, Person>();
dict.AddPerson(person);
dict.RemovePerson(person);
编辑 跌宕我明白了:只有一个添加和去掉?嗯。不知道这样的结构存在。也许你可以添加一个扩展方法来处理这种情况。
我更改了代码...
如何添加/删除工作?一个'params []'超载?在我看来,你仍然需要多次调用'dict.Add()',这意味着@ Verarind的解决方案是最好的选择。 –
是的,我实际上已经考虑过多键/多字典解决方案,但我必须支持50多种语言!无论哪种方式,这意味着50人的一个人的副本,我做了很多添加/删除。这有点浪费空间。想知道是否有更优雅的解决方案。 – user3685285
@ user3685285 _waste of space_?你需要将一个键存储到一个指针。我不认为有一种结构比字典需要更少的空间,并且支持快速访问值。 –