C#结构体列表搜索及不同长度列表地址值对比问询
解决方案:地址查找与列表数据一致性校验
嘿,针对你提出的需求——从EEPromCurrList中按地址查找数据/索引,以及对比两个同类型列表的相同地址数据是否一致,我整理了实用的实现方案,一起来看看:
一、根据指定地址查找对应的数据或索引
你的MemoryLocation是值类型结构体,结合List<T>的方法,我们可以用两种高效方式实现查找:
1. 获取对应地址的数据值
如果只需要拿到匹配地址的data,LINQ的FirstOrDefault是个不错的选择,但要注意值类型的默认值问题:
byte targetAddr = 8; // 查找第一个匹配地址的元素 var matchedItem = EEPromCurrList.FirstOrDefault(item => item.address == targetAddr); // 因为值类型默认address为0,所以如果目标地址不是0,直接判断address是否匹配即可 if (matchedItem.address == targetAddr) { byte foundData = matchedItem.data; Console.WriteLine($"找到地址{targetAddr}对应的数据:{foundData}"); } else { Console.WriteLine($"未发现地址为{targetAddr}的元素"); }
要是你的目标地址可能是0,建议先通过
Any判断存在性,避免误判:
if (EEPromCurrList.Any(item => item.address == targetAddr)) { byte foundData = EEPromCurrList.First(item => item.address == targetAddr).data; // 这里处理找到的数据 }
2. 获取匹配元素的索引
如果需要知道元素在列表中的位置,用List<T>自带的FindIndex方法最直接:
int targetIndex = EEPromCurrList.FindIndex(item => item.address == targetAddr); if (targetIndex != -1) { Console.WriteLine($"地址{targetAddr}的元素索引是:{targetIndex}"); byte foundData = EEPromCurrList[targetIndex].data; } else { Console.WriteLine($"未找到地址{targetAddr}的元素"); }
二、对比两个不同长度列表的地址数据一致性
假设你有另一个同类型列表EEPromCompareList,我们需要校验两个列表中相同地址的data是否一致,同时还要处理一方有另一方没有的地址,这里提供两种方案:
1. 基础遍历对比(适合小规模列表)
直接遍历其中一个列表,逐个匹配另一个列表的元素:
// 假设EEPromCompareList已填充数据 List<MemoryLocation> EEPromCompareList = new List<MemoryLocation>(); // 先检查当前列表的地址在对比列表中的匹配情况 foreach (var currItem in EEPromCurrList) { var compareItem = EEPromCompareList.FirstOrDefault(item => item.address == currItem.address); if (compareItem.address == currItem.address) { if (currItem.data == compareItem.data) { Console.WriteLine($"地址{currItem.address}:数据一致(值为{currItem.data})"); } else { Console.WriteLine($"地址{currItem.address}:数据不一致!当前列表={currItem.data},对比列表={compareItem.data}"); } } else { Console.WriteLine($"地址{currItem.address}:对比列表中无此地址"); } } // 再检查对比列表独有的地址 foreach (var compareItem in EEPromCompareList) { if (!EEPromCurrList.Any(item => item.address == compareItem.address)) { Console.WriteLine($"地址{compareItem.address}:当前列表中无此地址"); } }
2. 字典优化(适合大规模列表,提升性能)
如果列表元素较多,遍历查找效率低,可以把其中一个列表转成字典(以address为键),这样查找时间复杂度降到O(1):
// 将对比列表转为字典,键是address,值是data var compareDict = EEPromCompareList.ToDictionary(item => item.address, item => item.data); // 遍历当前列表进行对比 foreach (var currItem in EEPromCurrList) { if (compareDict.TryGetValue(currItem.address, out byte compareData)) { if (currItem.data == compareData) { Console.WriteLine($"地址{currItem.address}:数据一致(值为{currItem.data})"); } else { Console.WriteLine($"地址{currItem.address}:数据不一致!当前列表={currItem.data},对比列表={compareData}"); } } else { Console.WriteLine($"地址{currItem.address}:对比列表中无此地址"); } } // 检查对比列表独有的地址 foreach (var addr in compareDict.Keys) { if (!EEPromCurrList.Any(item => item.address == addr)) { Console.WriteLine($"地址{addr}:当前列表中无此地址"); } }
注意:如果你的列表中存在重复地址的元素(多个元素的address相同),
ToDictionary会抛出异常(因为字典键必须唯一)。这种情况需要先处理重复项,比如保留最后一个出现的元素,或者根据业务逻辑合并数据。
内容的提问来源于stack exchange,提问作者Xabarass
相关产品推荐
相关产品推荐

