我列出了每个人都有两组基因的人。基因由前几个字母字符串指定。大写字母表示它是显性等位基因,小写字母表示隐性。
每组的第一个字符指定眼睛颜色,不同等位基因的组合允许不同的眼睛颜色。
是否可以查找等位基因组合,即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”,是否有一种有效的方法来执行此操作,或者我是否必须强制它?
答案 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)
没有有效的机制来根据子字符串查找所有键。虽然进行多次查找可以起作用,但它也不是很有效。 有效处理这种方法的一种方法是引入一个附加字典,它将字母作为键,并将其映射到另一个字典中的多个键,所有这些键都包含该字母。 然后,查找可以如下:
当然,这需要在两个词典中添加项目。
答案 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;,这也适用。