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])
        );
    }

CSV 到字典时出错

您的 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();
}