2016-04-21 93 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