所以我将我的字典设置如下:
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
答案 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 <字符串,字符串> 。关键是电子邮件地址。该值是一个组。为每个电子邮件地址添加一个组。可以多次添加组。这使您的查找变得简单。