-1

我有一本字典:

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 方法中的 Calls 变量中遇到错误

4

1 回答 1

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
              };
于 2012-10-29T06:59:26.973 回答