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

时间:2014-04-17 01:18:04

标签: c# data-structures

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

"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'

1 个答案:

答案 0 :(得分:3)

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

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);

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