在C#中搜索多值字典中的密钥

时间:2017-12-05 22:06:35

标签: c# dictionary search

我想设置一个像这样的查找表:

 Key           Value
 -----         ------------------
 Cat           Lion, Tiger, Cheetah
 Fish          Dolphin, Whale
 Dog .         Pitbull, Doberman 

“Lion”的输入将返回键“Cat”

我已经设置了3种初始化数据的方法:

字典:

var map = new Dictionary<string,string>
{
    ["Dolphin"] = "Fish",
    ["Lion"] = "Cat",
    //....
};

HashSet:

var data = new Dictionary<string, HashSet<string>>
{
    {"cat", new HashSet<string> {"Lion", "Tiger", "Cheetah"}},
    {"fish", new HashSet<string> {"Dolphin", "Whale"}},
    {"Dog", new HashSet<string> {"Pitbull", "Doberman"}}
};

元组:

var data = new List<Tuple<string, List<string>>>
{
    Tuple.Create<string,List<string>> ("Cat", new List<string> { "Cheetah", "Lion" }), 
    Tuple.Create<string,List<string>> ("Dog", new List<string> { "Doberman", "Pitbull" }), 
    Tuple.Create<string,List<string>> ("Fish", new List<string> { "Dolphin", "Whale" }), 

};

鉴于一只动物,我想要归还它的类型。 我知道字典我可以调用ContainsKey方法。

其他两个选项有类似之处吗?

数据集不是那么大,(约15个键有10个左右的值),所以我也想知道一个选项在性能方面是否优于另一个选项。

3 个答案:

答案 0 :(得分:2)

我建议采用一种不同的方法。

public abstract class Animal
{
    public string Type { get; }
    public string Name { get; }

    protected Animal(string type, string name)
    {
        Type = type;
        Name = name;
    }
}

public class Cat : Animal
{
    public Cat(string name) : base("Cat", name)
    {
    }
}

public class Fish : Animal
{
    public Fish(string name) : base("Fish", name)
    {
    }
}

public static class Program
{
    public static void Main(string[] args)
    {
        List<Animal> list = new List<Animal>();
        list.Add(new Cat("Cheetah"));
        list.Add(new Fish("Dolphin"));

        var cheetahType = list.FirstOrDefault(animal => animal.Name == "Cheetah")?.Type;
        var doplhinType = list.FirstOrDefault(animal => animal.Name == "Dolphin")?.Type;
    }
}

如果您实际上并不需要那么多,那么您可以Animal非抽象并定义enum而不是string Type并删除派生的孩子。

答案 1 :(得分:2)

使用Dictionary<string, string>选项。

var animalToType = new Dictionary<string,string>
{
    ["Dolphin"] = "Fish",
    ["Lion"] = "Cat",
    //....
};
var lionType = animalToType["Lion"];

其他选项不会那么简单。它们都将涉及循环,无论是直接还是Linq调用隐藏。

答案 2 :(得分:1)

就个人而言,这个架构有点棘手......我的意思是,通常查找是基于键而不是值,但我知道有时你需要反转常见的逻辑并在数据结构中检索你需要的东西在许多其他情况下这是足够的,除了那个!

无论如何,如果给出了我的选择,我会采用HashSet方法,因为它可以授予其值的唯一性,也可以立即聚合子类型。但是你最终可以运行一个基准测试,并在几分钟内找到最快的查找解决方案。

使用上述方法(我的意思是HashSet),您可以按如下方式检索您的类型:

String animalType = data.Where(kvp => kvp.Value.Contains("Dolphin")).Select(p => p.Key).FirstOrDefault();

// Animal type found: Fish!
if (animalType != null)
    Console.WriteLine("Animal type found: " + animalType + "!");
else
    Console.WriteLine("No animal type found!");