2016-04-21 53 views
2

不知道为什么这不起作用,它是从可以工作的代码改编而来。看起来像我需要一个明确的演员,但我不知道为什么或在哪里把它。错误是:CSV到字典的错误

“无法隐式转换类型 'System.Collections.Generic.IEnumerable {{System.Collections.Generic.Dictionary字符串,字符串}}' 到“System.Collections.Generic.Dictionary {串,串}'”

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

这可能会帮助你解释这段代码试图做什么,确切地说。下面有几个答案正确地指出,你声明的返回类型和你的'return'语句是冲突的,但是如果不知道你的目标就很难超越它。 –

+0

我想从结构化的CSV(只有一个匹配是可能的),通过where子句,以及标题行,标题值作为关键字和行值作为返回的字典中的值拉单匹配行。 – xnguyeng

回答

4

你的LINQ查询返回一个IEnumerable<T>对象,其中T是类型字典的,而不是你期待的字典。

如果我理解你的代码,你基本上想创建一个字段列表,其中列标题是关键字,行的列索引值是值。由于字典不能有重复的键,所以不能将整个事物变成一个字典对象,因为会有重复键的例外。

所以,基本上你想要将ToDictionary()调用从Linq语句中取出并应用到Linq语句的结果中,而不是使用它来获取字典。不幸的是,这会导致上述重复键错误与当前编码的方式不同,而不是返回字典,您可能会考虑使用不同的数据结构或将返回类型更改为IEnumerable<Dictionary<string,string>>类型。

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

这个改编的代码确实拉了一个List >。在这种情况下,我想要从结构化的CSV文件中提取一行; where子句将确保一个唯一的键被拉下来,因为只有一行将匹配。 – xnguyeng

+0

在这种情况下,将ToDictionary移动到Linq语句之外,因为它现在被应用在里面,因此查询返回一个IEnumerable字典。 – exceptionthrown

+0

听起来不错,但我不知道如何完成它。如果我将语句保持原样,那么Linq语句中的变量超出范围。 – xnguyeng