C#中如何在foreach循环中关联两个HashSet变量并保序?
在HashSet上实现有序元素配对的解决方案
原始代码与需求
string variableAs = "A12,B12,C12"; string variableBs = "1.54,75.30,55.50"; // 方法参数为HashSet,无法修改类型 void Method(HashSet<string> variableAs, HashSet<double> variableBs) { foreach (var variableA in variableAs) { // 需求:让A12对应1.54、B12对应75.30,保留数据类型与原始顺序 } }
问题核心
HashSet
解决方案
方案一:基于原始字符串重建有序映射(推荐)
如果能访问原始的逗号分隔字符串,直接分割为有序数组后使用Zip,确保对应关系完全匹配:
void Method(HashSet<string> variableAs, HashSet<double> variableBs) { // 原始字符串(假设可访问) string variableAsStr = "A12,B12,C12"; string variableBsStr = "1.54,75.30,55.50"; // 分割为有序集合 var orderedAs = variableAsStr.Split(','); var orderedBs = variableBsStr.Split(',').Select(double.Parse).ToArray(); // 遍历配对,同时校验HashSet中存在该元素 foreach (var pair in orderedAs.Zip(orderedBs, (a, b) => new { A = a, B = b })) { if (variableAs.Contains(pair.A) && variableBs.Contains(pair.B)) { // 此处使用pair.A(string类型)和pair.B(double类型),顺序完全符合需求 // 示例操作: Console.WriteLine($"{pair.A} 对应值:{pair.B}"); } } }
方案二:仅使用HashSet参数(无原始字符串访问权限)
如果无法获取原始字符串,需通过自定义规则确保顺序匹配(例如按元素排序),但仅在排序规则能对应原始关系时有效:
void Method(HashSet<string> variableAs, HashSet<double> variableBs) { // 按自定义规则排序(示例:按字符串字母顺序、数值大小排序) var sortedAs = variableAs.OrderBy(a => a).ToList(); var sortedBs = variableBs.OrderBy(b => b).ToList(); // 使用Zip配对 foreach (var pair in sortedAs.Zip(sortedBs, (a, b) => new { A = a, B = b })) { // 使用配对后的元素 Console.WriteLine($"{pair.A} 对应值:{pair.B}"); } }
关键说明
HashSet
内容的提问来源于stack exchange,提问作者Sam Ash
相关产品推荐
相关产品推荐

