如何在以字符串数组为键的字典中进行搜索

时间:2019-03-14 16:56:42

标签: c# dictionary

所以我将我的字典设置如下:

Dictionary<string[], string> d = new Dictionary<string[], string>();
d.Add(new[] { "email@yahoo.com", "test@yahoo.com" }, "Group 1");
d.Add(new[] { "myemail@gmail.com", "checkit@gmail.com" }, "Group 2");

string keycheck = "email@yahoo.com";
string val = "";

d.TryGetValue(keycheck, out string k);

我收到以下错误:

  

参数1:无法从“字符串”转换为“字符串[]”(CS1503)   (项目1)

这很有意义,因为字典中的键是一个String数组。

如何更新代码,以便可以基于电子邮件字符串在“词典”中找到值。

因此,如果上面提供了keycheck,则返回值应为Group 1

3 个答案:

答案 0 :(得分:1)

var result = d.FirstOrDefault(x=>x.Key.Contains(keycheck));

它返回一个KeyValuePair,要获取值,您可以执行.Value。如果找不到,它将返回一个KeyValuePair,其中键和值均为null

但是,请注意,使用数组作为键并在数组内搜索字符串,您将失去Dictionary的最大好处之一,这是在给定键的情况下检索值的更快方法。

答案 1 :(得分:1)

您整理数据的方式将无法查询O(1)处的索引。所有搜索将很慢。 要有效使用Dictionary<TKey, TValue>,您需要执行以下操作:

    class Group : List<string>
    {
        public string Name { get; set; }
        public Group(string name) => Name = name;
    }

    static void Main(string[] args)
    {
        var groups = new List<Group> {
            new Group("Group 1") { "email@yahoo.com", "test@yahoo.com" },
            new Group("Group 2") { "myemail@gmail.com", "checkit@gmail.com" }
        };


        var index = groups
            .SelectMany(group => group.Select(item => (item, group)))
            .ToDictionary(x => x.item, x => x.group);

        // This will be a very fast operation
        var whichGroup = index["test@yahoo.com"].Name; // = "Group 1"
    }

如果您的数据集已更新,那么您还需要更新索引。为此,您可以扩展Collection<T>,使您可以使用覆盖来处理更改。

请注意,这种方法意味着每个值只能在1个组中。如果需要在多个组中具有相同的值,则索引值将成为一个列表。

答案 2 :(得分:0)

使用 IDictionary <字符串,字符串> 。关键是电子邮件地址。该值是一个组。为每个电子邮件地址添加一个组。可以多次添加组。这使您的查找变得简单。