繁体   English   中英

我应该使用什么数据结构从可能的字符串数组中查找字符串?

[英]What data structure should I use to look up a string from an array of possible strings?

如果我有以下抽象数据结构:

"blue", ["sky", "water", "blueberry"]
"green", ["grass", "frog", "lime", "leaf"]
"red", ["blood", "apple", "ruby", "firetruck"]
"purple", ["plum", "petunia"]

如果我想通过传入数组中的一个匹配值来检索“键”,那么哪种数据结构最能支持此操作? 我正在寻找易用性(例如清洁代码)和效率的组合。

由于它被提出:键和值是唯一的,并且在任何键之间不会重复两个值(例如,在任何地方都没有重复)。

这是我的方式,但我很确定这不是最好的方式,因为你应该通过键访问值来使用词典,而不是相反。

public class ContainerClass
{
    private static Dictionary<string, string[]> Data { get; set; }

    static ContainerClass()
    {
        Data = new Dictionary<string, string[]>
        {
            {"blue", new string[] {"sky", "water", "blueberry"}},
            {"green", new string[] {"grass", "frog", "lime", "leaf"}},
            {"red", new string[] {"blood", "apple", "ruby", "firetruck"}},
            {"purple", new string[] {"plum", "petunia"}}
        };
    }

    public static string GetValue(string lookup)
    {
        foreach(var item in Data)
        {
            if (item.Value.Contains(lookup))
            {
                return item.Key;
            }
        }
        return null;
    }
}

用法示例:

ContainerClass.GetValue("lime"); // Should return 'green'

从您提供的信息来看,似乎最简单的解决方案是像这样反转字典:

static ContainerClass()
{
    Data = new Dictionary<string, string>
    {
        {"sky", "blue"},
        {"water", "blue"},
        {"blueberry", "blue"},
        {"grass", "green"},
        ...
        {"blood", "red"},
        ...
        {"plum", "purple"},
        ...
    };
}

这样你就可以查找这样的值:

public static string GetValue(string lookup)
{
    string result;
    Data.TryGetValue(lookup, out result);
    return result;
}

当然,你可以用一个简单的Linq从一个普通的'前向'词典生成这个'倒置'字典:

var keyValueDict = new Dictionary<string, string[]>
{
    {"blue", new string[] {"sky", "water", "blueberry"}},
    {"green", new string[] {"grass", "frog", "lime", "leaf"}},
    {"red", new string[] {"blood", "apple", "ruby", "firetruck"}},
    {"purple", new string[] {"plum", "petunia"}}
};
var valueKeyDict = keyValueDict 
        .SelectMany(x => x.Value, Tuple.Create)
        .ToDictionary(t => t.Item2, t => t.Item1.Key);

这将生成一个与上面指定的字典相同的字典。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM