2012-10-29 70 views
-1

我有一本字典:訪問C#字典和返回值

Dictionary<ICD_Map2, string> maps = new Dictionary<ICD_Map2, string>(); 

我通過點擊按鈕添加到字典:

private void button2_Click(object sender, EventArgs e) 
{ 
    maps.Clear(); 
    // Load mapping file. 
    var reader = new StreamReader(File.OpenRead(@"Call_Details_Map.csv")); 
    while (!reader.EndOfStream) 
    { 
     var line = reader.ReadLine(); 
     var values = line.Split(','); 

     maps.Add(new ICD_Map2(values[0].Replace("\"",""), values[1].Replace("\"","")), values[2].Replace("\"","")); 
    } 
} 

我想使用LINQ和我的鑰匙映射到「字符串「在地圖上。

我該怎麼做?

var File001 = from line in File.ReadLines(ICD_process) 
       let l = line.Split(',') 
       where l[0] != "\"Statement Date\"" 
       select new 
       { 
        CallType = maps.ToLookup(p => l[5], p => l[3]), 
        Calls = l[11] == "\"\"" ? "0" : (maps.ToLookup(p => l[5], p => l[3]) == "Mobile Data" || maps.ToLookup(p => l[5], p => l[3]) == "Mobile SMS") ? "0" : l[11].Replace("\"","").ToString()) 
       }; 

我正在通話中的變量錯誤FILE001 LINQ的方法

+0

什麼是在字典中的價值?你能詳細說明嗎?示例鍵和您的地圖中的值,輸入和預期輸出? –

+0

@CuongLe我的詞典看起來像: 「Mobile SMS」| 「澳大利亞」| 「文本」; 「手機短信」| 「國際」| 「海外文本」; 「手機短信」| 「其他」| 「手機短信」; –

+1

這是dic的價值嗎? –

回答

0

目前尚不清楚你想達到什麼目的,但這裏是我的建議。現在你正在使用這樣的排列線陣列l[0] != "\"Statement Date\""。我認爲只有你知道索引9應該是什麼數據。它不太易讀,容易出錯(Statemnet Date中的拼寫錯誤,錯誤的索引),而且很難維護。相反,這會創建一個對象,它將爲您解析行,並通過具有良好名稱的強類型屬性提供數據。

public class ICDEntry 
{ 
    public static ICDEntry CreateFrom(string line) 
    { 
     string[] values = line.Split(','); 
     var entry = new ICDEntry(); 
     // assign values to properties: 
     // if (values[0] == "\"Statement Date\"") 
     //  entry.StatementDate = DateTime.Parse(values[1]); 
     //  entry.IsSomething = values[11] == "\"\"" 
     return entry; 
    } 

    public DateTime? StatementDate { get; private set; } 
    public string MobileSMS { get; private set; } 
    public bool IsSomething { get; private set; } 
} 

現在你可以分析每一行,然後強類型的世界進行查詢工作到您的ICD項:

var entries = File.ReadLines(ICD_process).Select(l => ICDEntry.CreateFrom(l)); 
var File001 = from e in entries 
       where e.StatementDate.HasValue 
       select new { 
        Calls = e.IsSomething ? "0" : e.MobileSMS; // use ICDEntry here 
       };