字典部分键匹配查询与等位基因组合匹配查询技术问询
针对你的两个问题的解决方案
问题1:字典的部分键匹配支持
原生的Dictionary<TKey, TValue>是基于精确键匹配设计的,没办法直接指定“部分键”来匹配任意剩余部分的键值对。不过我们可以通过几种方式实现类似的需求,具体取决于你对“部分键”的定义:
前缀/后缀/包含匹配:如果你的键是字符串类型,想要匹配包含特定子串、前缀或后缀的键,可以用LINQ直接查询字典的
Keys集合。比如要找所有以"Ab"开头的键:var targetPrefix = "Ab"; var matchingEntries = myDictionary .Where(kv => kv.Key.StartsWith(targetPrefix)) .ToDictionary(kv => kv.Key, kv => kv.Value);如果是模糊匹配(比如包含任意位置的特定片段),把
StartsWith换成Contains即可。自定义键匹配逻辑:如果你的键不是字符串,或者需要更复杂的匹配规则,可以封装一个自定义的字典类,内部维护原生字典,对外提供带匹配条件的查询方法。比如:
public class PartialMatchDictionary<TKey, TValue> { private readonly Dictionary<TKey, TValue> _innerDict = new(); public void Add(TKey key, TValue value) => _innerDict.Add(key, value); public IEnumerable<KeyValuePair<TKey, TValue>> FindMatches(Func<TKey, bool> matchCondition) { return _innerDict.Where(kv => matchCondition(kv.Key)); } }使用的时候就可以传入任意匹配逻辑,比如针对数字键找大于100的:
var dict = new PartialMatchDictionary<int, string>(); var matches = dict.FindMatches(key => key > 100);正则表达式匹配:如果键是字符串且需要复杂的模式匹配,用正则会更灵活。比如匹配以"A"开头后跟任意单个字符的键:
var pattern = @"^A.$"; var regex = new Regex(pattern); var matchingEntries = myDictionary .Where(kv => regex.IsMatch(kv.Key)) .ToDictionary(kv => kv.Key, kv => kv.Value);
问题2:基因组合的显性等位基因查询
针对你的基因查询需求,核心是判断某个等位基因组合中是否存在显性的A(大写)。假设你的人员列表是类似这样的结构:
public class Person { // 两组基因,比如每组是类似"Ab"、"cA"这样的字符串 public string GeneSet1 { get; set; } public string GeneSet2 { get; set; } // 其他属性,比如眼睛颜色等 public string EyeColor { get; set; } } List<Person> people = new List<Person>(); // 填充人员数据...
我们可以先写一个辅助方法,用来判断单个基因组合是否包含显性A:
private bool HasDominantA(string genePair) { // 只要基因组合里有大写A,就返回true return genePair.Contains('A'); }
然后就可以用LINQ筛选出符合条件的人员——无论是任意一组基因包含显性A,还是两组都满足(根据你的需求调整):
// 筛选出至少一组基因包含显性A的人员 var peopleWithDominantA = people .Where(p => HasDominantA(p.GeneSet1) || HasDominantA(p.GeneSet2)) .ToList();
如果你的需求是针对特定的基因组合模式(比如查询"Ab"、"Ac"、"cA"这类具体组合),也可以直接匹配这些字符串:
var targetGenePairs = new HashSet<string> { "Ab", "Ac", "cA" }; var matchingPeople = people .Where(p => targetGenePairs.Contains(p.GeneSet1) || targetGenePairs.Contains(p.GeneSet2)) .ToList();
两种方式可以结合起来:比如先判断是否包含显性A,再进一步筛选特定模式,完全取决于你具体的业务规则。
内容的提问来源于stack exchange,提问作者Joseph Garrett
相关产品推荐
相关产品推荐

