如何从字符串列表中筛选包含指定整数列表元素的项?
问题描述
现有字符串列表:
List<string> aStringList = new List<string>() { "meat1", "meat2", "tomato3", "tomatoes4", "brocolli5", "brocoli6" };
以及整数参数列表:
List<int> aIntList = new List<int>() { 1, 2, 6 };
需要生成仅包含meat1、meat2、brocoli6的新列表。当前写法硬编码索引判断,既不优雅也无动态性:
var matchingvalues = aStringList.Where(s => s.Contains(aIntList [0].ToString()) || s.Contains(aIntList [1].ToString()) || s.Contains(aIntList [2].ToString()) );
求优化方案。
优化方案
方法1:用LINQ Any实现动态匹配
先将整数列表转为字符串集合,再通过Any判断字符串是否包含集合内任意元素,适配aIntList的任意长度变化:
var targetNumStrings = aIntList.Select(n => n.ToString()).ToList(); var matchingValues = aStringList.Where(s => targetNumStrings.Any(num => s.Contains(num)));
方法2:提取末尾数字精准匹配
如果字符串的数字固定在末尾,可提取数字后直接判断是否在目标整数列表中,避免中间包含数字导致的误匹配(比如meat12不会被错误匹配):
var matchingValues = aStringList.Where(s => { // 提取字符串末尾的连续数字 var numSegment = new string(s.Reverse().TakeWhile(char.IsDigit).Reverse().ToArray()); return int.TryParse(numSegment, out int num) && aIntList.Contains(num); });
方法3:预编译正则表达式(高频场景适用)
若需多次执行匹配,可预编译包含目标数字的正则表达式,提升性能:
var numPattern = string.Join("|", aIntList.Select(n => Regex.Escape(n.ToString()))); var matchRegex = new Regex($@"{numPattern}$", RegexOptions.Compiled); // $确保匹配末尾数字 var matchingValues = aStringList.Where(s => matchRegex.IsMatch(s));
内容的提问来源于stack exchange,提问作者Kuroyuki Hikari
相关产品推荐
相关产品推荐

