CSV 到字典时出错
本文关键字:出错 字典 CSV | 更新日期: 2024-11-06 20:21:43
不知道为什么这不起作用,它改编自确实有效的代码。看起来我需要一个明确的演员表,但我不确定为什么或在哪里放置它。错误是:
"无法隐式将类型'System.Collections.Generic.IEnumerable{System.Collections.Generic.Dictionary{string,string}}'转换为'System.Collections.Generic.Dictionary{string,string}'"
public static Dictionary<string, string> Data_Entry(string dataEntity, string dataCategory, string dataStream = "")
{
var lines = File.ReadAllLines(@"C:'MyFile.csv");
var header = lines.First().Split(',');
return (from line in lines.Skip(1)
let cols = line.Split(',')
where cols[0].ToUpper() == dataEntity & cols[1].ToUpper() == dataCategory & cols[4].ToUpper() == dataStream
select header.Select((h, i) => new { header = h, index = i })
.ToDictionary(o => o.header, o => cols[o.index])
);
}
您的 Linq 查询返回一个 IEnumerable<T>
对象,其中 T 的类型是字典,而不是您期望的字典。
如果我理解您的代码,您本质上想要创建一个字典列表,其中列标题是键,行的列索引值是值。由于字典不能有重复的键,因此您不能将整个内容转换为一个字典对象,因为重复键会有例外。
因此,本质上您希望从 Linq 语句中提取 ToDictionary() 调用并将其应用于 Linq 语句的结果,而不是获取字典。不幸的是,这将导致当前编码方式出现上述重复键错误,因此您可以考虑不同的数据结构或将返回类型更改为IEnumerable<Dictionary<string,string>>
类型,而不是返回字典。
编辑:根据评论中的后续信息,以下内容将带您到达您需要的地方。请注意,我已将 FirstOrDefault() 调用添加到 Linq 查询的结果中。这意味着它将返回满足方法返回类型的第一个结果(类型 Dictionary<string,string>
)。值得在调用代码中检查一下 null 返回,以防万一,即使您确信它永远不会为 null。
public static Dictionary<string, string> Data_Entry(string dataEntity, string dataCategory, string dataStream = "")
{
var lines = File.ReadAllLines(@"C:'MyFile.csv");
var header = lines.First().Split(',');
return (from line in lines.Skip(1)
let cols = line.Split(',')
where cols[0].ToUpper() == dataEntity & cols[1].ToUpper() == dataCategory & cols[4].ToUpper() == dataStream
select header.Select((h, i) => new { header = h, index = i })
.ToDictionary(o => o.header, o => cols[o.index])
).FirstOrDefault();
}