基于子串过滤List<string>及按特定规则排序SKU列表的技术问询
嗨,我来帮你搞定这两个日常开发里的常见问题,咱们一个个来拆解:
1. 如何仅基于子串对List集合进行过滤?
在.NET生态里用LINQ就能轻松实现,核心是结合Where方法和字符串的匹配逻辑,给你几个实用场景的例子:
基础区分大小写过滤:要筛选包含指定子串的元素,直接用
Contains就够了:List<string> originalList = new List<string> { "apple pie", "banana bread", "cherry tart", "apple cider" }; string targetSubstring = "apple"; List<string> filteredList = originalList.Where(s => s.Contains(targetSubstring)).ToList(); // 结果:["apple pie", "apple cider"]忽略大小写的过滤:如果不需要区分大小写(比如要匹配"Apple"和"apple"),用
IndexOf配合忽略大小写的规则更稳妥:List<string> filteredList = originalList.Where(s => s.IndexOf(targetSubstring, StringComparison.OrdinalIgnoreCase) >= 0 ).ToList();匹配开头/结尾的子串:要是需要筛选以某子串开头或结尾的元素,直接用
StartsWith或EndsWith效率更高:// 筛选以"banana"开头的元素 List<string> startFiltered = originalList.Where(s => s.StartsWith("banana")).ToList(); // 筛选以"tart"结尾的元素 List<string> endFiltered = originalList.Where(s => s.EndsWith("tart")).ToList();
2. SKU排序方案
根据你给出的SKU规则,排序逻辑应该是先按分组(第4-6位)排序,再按组内优先级(第7-9位,数值越小越靠前)排序,前3位和第10位及以后的填充位不影响排序。用LINQ的OrderBy+ThenBy就能实现,还能顺便处理边界异常:
假设你的SKU列表是这样的:
List<string> skuList = new List<string> { "XXXABC123XYZ", "XXXDEF001UVW", "XXXABC056LMN", "XXXDEF023PQR" };
对应的排序代码:
List<string> sortedSkuList = skuList .OrderBy(sku => { // 提取第4-6位(索引从0开始,所以取Substring(3, 3)) if (sku.Length >= 6) return sku.Substring(3, 3); // SKU长度不足时返回空串,让它排到最后 return string.Empty; }) .ThenBy(sku => { // 提取第7-9位,转成int比较数值大小 if (sku.Length >= 9 && int.TryParse(sku.Substring(6, 3), out int priority)) { return priority; } // 无效优先级返回最大值,让它排到组内最后 return int.MaxValue; }) .ToList();
排序后的结果会是:
XXXABC056LMN, XXXABC123XYZ, XXXDEF001UVW, XXXDEF023PQR
这里加了边界处理,避免SKU长度不够或优先级格式错误时抛出异常,你可以根据实际需求调整这些异常场景的处理逻辑。
内容的提问来源于stack exchange,提问作者JasonG
相关产品推荐
相关产品推荐

