如何在不定义类的情况下将CSV动态数据中的多种类型值存入单个列表?
解决同一列表存储int和string的问题
嘿,这个场景我碰到过不少次——你需要把CSV里的混合类型数据(字符串和整数)存入同一个列表,又不想自定义类,对吧?
核心解决方案:用List<object>
在C#里,object是所有类型的基类,不管是int还是string都能隐式转换为object类型,所以把列表声明为List<object>就能完美解决你的类型不匹配问题。
修改后的代码如下:
string[] val = new string[] {"hi","20"}; List<object> obj = new List<object>(); // 这里把something替换成object int intval; for(int i=0;i<val.Length;i++) { if(int.TryParse(val[i], out intval)) { obj.Add(intval); // 注意C#方法名是大写开头的Add,不是小写add } else { obj.Add(val[i]); } }
为什么原来的代码报错?
你之前遇到的“Cannot implicitly convert int to string”错误,本质是类型容器不匹配:如果列表声明成List<string>,存入int类型值时会触发转换失败;如果声明成List<int>,存入字符串也会报错。List<object>作为通用容器,能容纳任何类型的对象,刚好适配你的混合类型存储需求。
其他可选方案:List<dynamic>
如果你需要在后续操作中直接调用列表元素的成员(比如字符串的Length或者整数的ToString()),也可以用List<dynamic>:
List<dynamic> obj = new List<dynamic>(); // 添加元素的逻辑和上面一致
不过要注意,dynamic会跳过编译时的类型检查,运行时才会解析类型,这可能带来性能损耗或者潜在的运行时错误,所以如果只是单纯存储不同类型的数据,List<object>更安全。
从列表取值时的注意事项
当你需要从List<object>里取出数据时,建议先判断类型再转换,避免类型转换异常,比如:
foreach(var item in obj) { if(item is int num) { Console.WriteLine($"这是整数:{num}"); } else if(item is string str) { Console.WriteLine($"这是字符串:{str}"); } }
内容的提问来源于stack exchange,提问作者yuvaraj anbazhagan
相关产品推荐
相关产品推荐

