代码之家  ›  专栏  ›  技术社区  ›  Si8

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

  •  0
  • Si8  · 技术社区  · 5 年前

    所以我把字典设置为:

    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:无法从“string”转换为“string[]”(CS1503) (项目1)

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

    如何更新代码以便根据电子邮件字符串在字典中查找值。

    所以如果 keycheck 如果在上面提供,则返回值应为 Group 1

    0 回复  |  直到 5 年前
        1
  •  1
  •   Magnetron    5 年前
    var result = d.FirstOrDefault(x=>x.Key.Contains(keycheck));
    

    它返回一个keyvaluepair,要获取可以执行 .Value 是的。如果找不到,它将返回一个keyvaluepair,其中键和值都是 null 是的。

    但是,请注意,使用数组作为键并在数组中搜索字符串,将失去字典的最大优点之一,因为字典是键,所以检索值的速度更快。

        2
  •  1
  •   Tamir Daniely    5 年前

    按照您排列数据的方式,您将无法在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> 它允许您使用覆盖处理更改。

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

        3
  •  0
  •   Kit    5 年前

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