C#中存储CSV文件数据的合适数据结构及程序逻辑问询
嘿,针对你处理这类CSV键值数据的场景,我整理了几个比单纯用List<KeyValuePair<string, double>>更实用的数据结构,适配不同的后续操作需求:
Dictionary<string, double>
这应该是最贴合你需求的选择!因为你的CSV第一列是唯一标识的字符串(假设单个文件内键不重复),Dictionary提供O(1)的快速查找效率,不管你是要匹配两个文件的相同键、还是单独提取某个键对应的值,都比遍历List高效太多。读取CSV时直接把每一行的键值对Add进去,后续取值只要dict["AC"]就能立刻拿到对应数值,非常方便。Lookup<string, double>
要是你的CSV里存在同一个字符串键对应多个数值的情况(比如某个ID重复出现),Lookup就很合适。它是.NET内置的只读结构,每个键对应一个数值集合,你可以用LINQ的ToLookup()方法快速把已有的List转换成Lookup,后续查找某个键的所有值会很省心。自定义类 + List
如果后续你可能需要给CSV数据扩展更多字段,或者想让代码可读性更高,不如定义一个简单的实体类:public class CsvDataRecord { public string Key { get; set; } public double Value { get; set; } }然后用
List<CsvDataRecord>来存储。这样代码逻辑会更清晰,后续做筛选、排序或者扩展字段都更灵活,比KeyValuePair更具可读性。OrderedDictionary(或自定义顺序+查找结构)
要是你既需要保留CSV行的插入顺序,又要快速查找键对应的值,OrderedDictionary(非泛型,可强转)就能满足需求。或者你也可以自己封装一个组合结构:用List存储顺序、用Dictionary存储键值映射,这样既能按原始顺序遍历,又能快速查找,兼顾两者的优势。
根据你提到的“取第一个值”的逻辑需求,如果是找两个文件中相同键的值,Dictionary的查找效率绝对是最优的;如果是要按行顺序取第一个出现的特定键值,那结合List的顺序性+Dictionary的快速定位会更高效。
内容的提问来源于stack exchange,提问作者TiredOfProgramming




