C# 将CSV转换为字典时出错

C# 将CSV转换为字典时出错,c#,dictionary,C#,Dictionary,不确定这为什么不起作用,它是根据起作用的代码改编的。看起来我需要一个明确的演员阵容,但我不知道为什么或者放在哪里。错误是: 无法将类型“System.Collections.Generic.IEnumerable{System.Collections.Generic.Dictionary{string,string}}”隐式转换为“System.Collections.Generic.Dictionary{string,string}” 您的Linq查询正在返回一个IEnumerable对象,其

不确定这为什么不起作用,它是根据起作用的代码改编的。看起来我需要一个明确的演员阵容,但我不知道为什么或者放在哪里。错误是:

无法将类型“System.Collections.Generic.IEnumerable{System.Collections.Generic.Dictionary{string,string}}”隐式转换为“System.Collections.Generic.Dictionary{string,string}”


您的Linq查询正在返回一个IEnumerable对象,其中T的类型为Dictionary,而不是您期望的Dictionary

如果我理解您的代码,您基本上希望创建一个字典列表,其中列标题是键,行的列索引值是值。由于字典不能有重复的键,所以不能将整个对象转换为一个字典对象,因为重复键会有例外

因此,本质上,您希望从Linq语句中提取ToDictionary调用,并将其应用于Linq语句的结果,而不是获取字典。不幸的是,这将导致重复的键入错误,而不是返回一个字典,因此您可能会考虑不同的数据结构,或者将返回类型更改为iQuestabyType。

编辑: 根据评论中的后续信息,以下内容将帮助您找到需要的地方。注意,我将FirstOrDefault调用添加到Linq查询的结果中。这意味着它将返回第一个结果,即满足方法返回类型的类型字典。在调用代码中检查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();
}

如果您确切地解释了这段代码的作用,可能会有所帮助。下面有几个答案正确地指出了您声明的返回类型和返回语句存在冲突,但在不知道您的目标的情况下,很难超越这一点。我想从结构化CSV中提取一个匹配行,通过where子句和标题行只能进行一个匹配,在返回的字典中,标题值作为键,行值作为值。该代码改编自一个列表。在本例中,我要做的是从结构化CSV文件中提取一行;where子句将确保提取唯一键,因为只有一行匹配。在这种情况下,将ToDictionary移到Linq语句的外部,因为现在它正在内部应用,因此查询将返回一个IEnumerable字典。这听起来不错,但我不确定如何实现。如果按原样拉出语句,Linq语句中的变量将超出范围。另一个选项是将.FirstOrDefault添加到Linq查询的结果中。在本例中,这将选择第一个对象或空对象。您需要确保只从Linq查询中获得一个或没有结果,并处理返回值为null的情况。CSV是结构化的,where子句和参数只能为此代码和文件返回一个匹配的行。
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();
}