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

时间:2018-03-26 21:26:24

标签: c# dictionary

我列出了每个人都有两组基因的人。基因由前几个字母字符串指定。大写字母表示它是显性等位基因,小写字母表示隐性。

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

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

到目前为止我的代码是:

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

和基因集的一个例子是

{"AabAC", "aBAAd"}

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

3 个答案:

答案 0 :(得分:0)

将包含所有不同值的字典作为键,将眼睛的颜色作为值。将你的基因分成大写字母或2个小写字母(共同支配)。然后您只需要一个简单的System.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();

答案 1 :(得分:0)

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

  1. 在第一本词典中找到包含等位基因的键
  2. 查找第二个字典中的每个键以找到基因
  3. 当然,这需要在两个词典中添加项目。

答案 2 :(得分:-1)

Dictionary有一个ContainsKey(key)方法:

从您的示例:

{"AabAC", "aBAAd"}

你可以拉出你的子串,我假设&#34; A&#34;或&#34; Aa&#34;。然后执行:

EyeColours.ContainsKey("A");

如果第一个成功,则不需要做第二个。如果没有尝试第二组。

如果两者都失败,也许有一些处理来插入一个新的集合。

来自https://msdn.microsoft.com/en-us/library/kw5aaea4(v=vs.110).aspx

&#34;此方法接近O(1)操作。&#34;

或者您也可以尝试使用Dictionary.TryGetValue(key)

来自https://msdn.microsoft.com/en-us/library/bb347013(v=vs.110).aspx

&#34;此方法接近O(1)操作。&#34;

两者都很有效,两者都内置在字典中。

string eyeColorSet1 = gene.Substring(0, 1) 

string eyeColorSet2 = gene.Substring(0, 2)

要使你的主要等位基因检查也不困难或昂贵。

我会将所有这些放入自己的名为

的方法中
string GetEyeColour(string geneSequence)

或其他相似之处。获取测试子字符串,搜索字典,添加新内容(如果您要处理的内容)。

鉴于字典方法的效率,仅保留1个集合并将其检查为2个值将比2个集合更容易管理和维护。如果您要从示例集中检查3个值,即&#34; A&#34;,&#34; a&#34;或&#34; Aa&#34;,这也适用。