-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 に答える