C# 是否可以使用字典指定密钥的一部分,并允许其余部分为数据类型允许的任何内容?

C# 是否可以使用字典指定密钥的一部分,并允许其余部分为数据类型允许的任何内容?,c#,dictionary,C#,Dictionary,我有一份名单,每个人都有两套基因。基因由前几个字母组成的字符串指定。大写字母表示它是显性等位基因,小写字母表示隐性 每组的第一个字符指定眼睛的颜色,不同等位基因的组合允许不同的眼睛颜色 是否可以查找等位基因的组合,即Ab、Ac或cA,并返回存在A的值 到目前为止,我的代码是: Dictionary<string, string> EyeColours = new Dictionary<string, string> { {"A","Blue"}, { "aa", "Dar

我有一份名单,每个人都有两套基因。基因由前几个字母组成的字符串指定。大写字母表示它是显性等位基因,小写字母表示隐性

每组的第一个字符指定眼睛的颜色,不同等位基因的组合允许不同的眼睛颜色

是否可以查找等位基因的组合,即Ab、Ac或cA,并返回存在A的值

到目前为止,我的代码是:

Dictionary<string, string> EyeColours = new Dictionary<string, string>
{ {"A","Blue"}, { "aa", "DarkBlue" }, { "bb", "Hazel" }, { "cc", "Gray" }, { "dd", "Amethyst" } };

如果前两个字符中的任何一个是A,我希望返回值“Blue”,是否有一种有效的方法来执行此操作,或者我必须强制执行此操作?

有一个字典,其中所有不同的值作为键,眼睛的颜色作为值。将你的基因拆分为大写字母或两个小写字母(共显性)。那么您只需要一个简单的系统。Linq查询:

string gene = <process it>;
List<string> result = new List<string>( );
result = dictionary.Where(kvp => kvp.Key.IndexOf(gene) >= 0).ToDictionary(kvp => kvp.Key, kvp => kvp.Value).Values.ToList();
string基因=;
列表结果=新列表();
结果=dictionary.Where(kvp=>kvp.Key.IndexOf(gene)>=0).ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value).Values.ToList();

字典有一个ContainsKey(键)方法:

从你的例子中:

{"AabAC", "aBAAd"}
你可以把你的子串拉出来,我假设是“A”或“Aa”。然后执行:

EyeColours.ContainsKey("A");
如果第一次启动成功,则无需执行第二次启动。如果没有,尝试第二套

如果两者都失败,可能需要一些处理来插入一个新的集合

“此方法接近O(1)操作。”

或者您也可以尝试Dictionary.TryGetValue(键)

“此方法接近O(1)操作。”

两者都是高效的,并且都内置在字典中

string eyeColorSet1 = gene.Substring(0, 1) 

让你的领先等位基因检查也不难,也不贵

我将把所有这些都放到它自己的名为

string GetEyeColour(string geneSequence)
或者类似的东西。获取你的测试子字符串,搜索字典,如果你想处理的话添加新的


考虑到dictionary方法的效率,只保留1个集合并检查其中的2个值将比2个集合更易于管理和维护。如果您要检查示例集中的3个值,即“A”、“A”或“Aa”,这也适用。

没有有效的机制根据子字符串查找所有键。虽然可以进行多次查找,但效率也不是很高。 有效处理此问题的一种方法是引入一个额外的字典,该字典将包含该字母作为键,并将其映射到另一个字典中的多个键,所有这些键都包含该字母。 然后,可以按如下方式进行查找:

  • 在第一个字典中找到包含等位基因的键
  • 在第二个字典中查找每个键以查找基因

  • 当然,这需要在两个词典中都添加条目。

    听起来不像是
    词典
    在这里会有所帮助,您可能只需扫描
    列表
    就可以找到匹配项,除非您有数十亿个匹配项。或者,有时需要预先计算所有可能的组合,并将它们填充到一个查找中,该查找可以是一个
    字典
    。可能是一个字典字典?您可以将其拆分为两个字典吗?一个用于单字母匹配,一个用于两个字母匹配?根据每个基因的第一个字符测试单个字母1,然后根据两个字符的组合测试两个字母1。我可能会像你建议的那样扫描一个列表,有多少项会变得无效?这个列表应该只包含25个左右的项目,但是如果我想在组合中添加一个新的字母,它的扩展性就不强了。我喜欢有两个字典,好在你只需要在字典中查找在某些条件下你的信息似乎矛盾-你说第一个字符指定眼睛颜色,然后显示眼睛颜色映射到两个字符?没有评论的否决票?这个答案遗漏了什么?
    
    string eyeColorSet2 = gene.Substring(0, 2)
    
    string GetEyeColour(string geneSequence)