2012-10-29 72 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 
       };