如果存在键子字符串,则返回字典值
本文关键字:返回 字典 字符串 存在 如果 | 更新日期: 2023-09-27 18:24:30
如果键包含与字符串查找匹配一半的字符串,我想从字典中返回值。
private readonly Dictionary<string, string> _ipAddressesDictionary = new Dictionary<string, string>()
{
{"ip.qwer4.abc5.somename", "6x.x.00.xx"},
{"ip.qwer3.abc1.somename", "6x.3.xx.xx"},
}
例如,
我有一个字符串"abc1.somename",我正在构建下面的逻辑-,它目前不起作用-以获得值给定的密钥名称包含该子字符串。我希望能得到"6x.3.xx.xx"。
public string LookUpPeerIp(string deviceName)
{
var value = _ipAddressesDictionary.Keys.Contains(deviceName);
return value.ToString();
}
编辑:
抱歉,伙计们,忘了提一下传递来查找的字符串也不完全匹配。它附带了一个.co.uk:(
所以它将是abc1.somename.co.uk,但字典有ip.qwer3.abc1.samename,没有.co.uk
在线试用https://dotnetfiddle.net/q6E1wR
这将切割正确的点-我的答案:
用法:
Console.WriteLine("--first");
Console.WriteLine(LookupByPrefix("abc1.somename.co.uk"));
Console.WriteLine("--many");
string[] many = LookupByPrefixMany("abc1.somename.co.uk");
foreach(string ip in many)
Console.WriteLine(ip);
对于单一结果:
public string LookupByPrefix(string domainName)
{
string[] dotDomains = domainName.Split('.');
for(int matchCount = dotDomains.Length; matchCount > 0; matchCount--)
{
string[] ret = LookUpPeerIpMany(string.Join(".", dotDomains.Take(matchCount)));
if(ret != null && ret.Length > 0) return ret.SingleOrDefault();
}
return null;
}
对于多个结果:
public string[] LookupByPrefixMany(string domainName)
{
string[] dotDomains = domainName.Split('.');
for(int matchCount = dotDomains.Length; matchCount > 0; matchCount--)
{
string[] ret = LookUpPeerIpMany(string.Join(".", dotDomains.Take(matchCount)));
if(ret != null && ret.Length > 0) return ret;
}
return null;
}
依赖项:
public string[] LookUpPeerIpMany(string deviceName)
{
return _ipAddressesDictionary
.Where(q=>q.Key.Contains(deviceName)).Select(q=>q.Value).ToArray();
}
很高兴能帮助你!
public string LookUpPeerIp(string deviceName)
{
var keySubstringMatch = _ipAddressesDictionary.Keys
.FirstOrDefault(key => key.Contains(deviceName));
if(keySubstringMatch == null)
return null;
else
return _ipAddressesDictionary[keySubstringMatch];
}
也许多次匹配是可能的,那么这将是一个很好的方法:
public IEnumerable<string> LookUpPeerIp(string deviceName)
{
var keySubstringMatch = _ipAddressesDictionary.Keys
.Where(key => key.Contains(deviceName));
foreach (string key in keySubstringMatch)
yield return _ipAddressesDictionary[key];
}
然后您可以处理所有匹配,例如:
string allMatching = String.Join(",", LookUpPeerIp("abc1.somename"));
这样做:
string partial = "abc5";
string value= _ipAddressesDictionary.FirstOrDefault(x => x.Key.Contains(partial)).Value;
如果您想返回包含字符串一部分的键的所有值(或第一个值),那么除了迭代所有键并返回适合您需要的键之外,别无选择。这将是O(N)的复杂性。
如果你可以用一个开头来代替contains,那么字典就不是一个好的选择。尝试一下你会得到更好的表现。框架中没有Trie的内置实现,但有几个开源实现可用。
首先搜索完全匹配,然后搜索部分匹配。然后使用正则表达式
public string LookUpPeerIp(string deviceName)
{
string value = null;
_ipAddressesDictionary.TryGetValue(deviceName, out value);
if (value != null)
return value;
var keyPair = _ipAddressesDictionary.FirstOrDefault(k => k.Key.Contains(value));
if (keyPair != null)
return keyPair.Value;
string pattern = @"your pattern";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
keyPair = _ipAddressesDictionary.FirstOrDefault(k => rgx.IsMatch(k.Key));
return keyPair != null ? keyPair.Value : null;
}
有关正则表达式的详细信息,请单击此处
https://www.google.ie/?gws_rd=cr,ssl&ei=4z1XVv oMsGsPMagotAG#q=c%23+正则表达式