优化字符串大小写变体分组函数:保留出现次数最多的变体
优化C#函数:保留大小写变体中出现次数最多的选项
我需要优化GetMostCommonItems函数,让它统计字符串列表中每个大小写变体组(例如apple/Apple/APPLE为同一组)内各变体的出现次数,最终只保留每组中出现次数最多的那个变体作为筛选选项。原函数逻辑是固定优先选小写、再首字母大写、最后全大写,现在要改成按实际出现次数来决定保留哪个。
优化后的代码
public static List<string> GetMostCommonItems(List<string> values) { // 过滤空值,将大小写视为同一组分组 var variantGroups = values .Where(value => !string.IsNullOrEmpty(value)) .GroupBy(value => value, StringComparer.InvariantCultureIgnoreCase); // 每组内统计各原始变体的出现次数,选出次数最多的 var mostCommonVariants = variantGroups .Select(group => group.GroupBy(original => original) .OrderByDescending(variantGroup => variantGroup.Count()) .First().Key); // 按字符串排序结果 var result = mostCommonVariants.OrderBy(str => str).ToList(); // 原列表包含空值时,添加null到结果 if (values.Any(value => string.IsNullOrEmpty(value))) { result.Add(null); } return result; }
优化说明
简化分组逻辑:
直接用StringComparer.InvariantCultureIgnoreCase做分组依据,把所有大小写变体归为同一组,避免原代码中嵌套的字典结构,逻辑更直观,内存开销更低。精准统计次数:
在每个大小写组内,对原始字符串(保留原大小写格式)再次分组,统计每个变体的出现次数,再按次数降序排序后取第一个,确保拿到出现次数最多的变体。空值处理优化:
用Any替代FirstOrDefault判断原列表是否包含空值,代码更简洁,性能也更优。平局情况处理(可选):
如果同一组内多个变体出现次数相同(比如Apple和apple都出现3次),当前代码会取组内最先出现的变体。如果需要自定义优先级(比如优先小写、优先首字母大写),可以在OrderByDescending后添加ThenBy条件:// 优先选择小写变体 .OrderByDescending(variantGroup => variantGroup.Count()) .ThenBy(variantGroup => variantGroup.Key == variantGroup.Key.ToLower() ? 0 : 1)或者:
// 优先选择首字母大写的变体 .OrderByDescending(variantGroup => variantGroup.Count()) .ThenBy(variantGroup => char.IsUpper(variantGroup.Key[0]) && variantGroup.Key.Substring(1).All(char.IsLower) ? 0 : 1)
内容的提问来源于stack exchange,提问作者Mitch Jones
相关产品推荐
相关产品推荐

