2

(このWindowsフォームアプリケーションでは)ファイルからハッシュテーブルにデータを読み取り、テキストボックスにハッシュテーブルのデータを入力しようとしていますが、コードを実行すると、常に例外がスローされます。追加されました。辞書のキー:''追加されるキー:'' "

初期コード:

string[] fileLines = File.ReadAllLines(@"C:path/ajand.txt");

foreach (string line in fileLines)
{
    // to split the first 9 chars in the string and use them as key values                
    string[] match = Regex.Split(line, line.Substring(0,9));
    hT.Add(match[0], line);
}

だから私は次のコードでキーの重複をチェックしようとしました

 string[] fileLines = File.ReadAllLines(@"C:path/ajand.txt");

 foreach (string line in fileLines)
 {
     string[] match = Regex.Split(line, line.Substring(0,9));

     if(!hT.ContainsKey(match[0])) // to check duplicates
     hT.Add(match[0], line);            
 }

しかし、プログラムを実行すると、対応するテキストボックスに、ハッシュテーブルに追加されたと「思われる」データが入力されません。問題が何であるか考えてください。

4

4 に答える 4

1

私が正しく理解していれば、次のような関数を使用できます。

public static Dictionary<string, string> LoadActivityLookup(string filePath) {
    const int KEY_LENGTH = 10;
    var newLookup = new Dictionary<string, string>();
    foreach (string line in File.ReadAllLines(filePath)) {
        if (line.Length < KEY_LENGTH) continue;
        string key = line.Substring(0, KEY_LENGTH);
        if (!newLookup.ContainsKey(key)) {
            string value = line.Substring(KEY_LENGTH);
            newLookup.Add(key, value);
        }
    }
    return newLookup;
}

辞書は、多数のキーセットでキーを繰り返し検索するのに最適です。ただし、後でそれらを反復処理できるように、コレクションに多数のキーと値のペアを保持するだけでよい場合は、代わりにList<>を使用します。

これは、文字列配列に完全なファイルをロードする代わりにStreamReaderを使用する上記の関数のバージョンです。

public static Dictionary<string, string> LoadActivityLookup(string filePath) {
    const int KEY_LENGTH = 10;
    var newLookup = new Dictionary<string, string>();
    using (StreamReader rdr = new StreamReader(filePath)) {
        string line = rdr.ReadLine();
        while (line != null) {
            if (line.Length < KEY_LENGTH) {
                line = rdr.ReadLine();
                continue;
            } 
            string key = line.Substring(0, KEY_LENGTH);
            if (!newLookup.ContainsKey(key)) {
                string value = line.Substring(KEY_LENGTH);
                newLookup.Add(key, value);
            }
            line = rdr.ReadLine();
        }
    }
    return newLookup;
}
于 2012-11-28T21:59:48.403 に答える
1
    public static Hashtable HashtableFromFile(string path)
    {
        try
        {
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                return (Hashtable)formatter.Deserialize(stream);
            }
        }
        catch
        {
            return new Hashtable(); 
        }            
    }
于 2015-12-27T19:43:09.510 に答える
0

重複を削除するには、インデックスを使用してハッシュテーブルに追加/更新するだけです。

string[] fileLines = File.ReadAllLines(@"C:path/ajand.txt");

foreach (string line in fileLines)
{
    // to split the first 10 chars in the string and use them as key values                
    string key = line.Length > 10 ? line.Substring(0,10) : line;
    hT[key] = line;
}
于 2012-11-28T20:29:17.517 に答える
0

これが役立つかどうかを確認してください。日付と行の残りの部分の間の区切り文字はスペースであると想定しています。日付をDateTimeオブジェクトに解析し、それをキーとして使用しようとします。行の残りの部分を値として使用します。インデクサーを使用して値をディクショナリに入れるという事実は、重複するキーの問題を排除しますが、同時に、同じ日付のエントリがある場合は値を上書きします。この場合、その日付の最後のエントリのみが辞書に保存されます。

var lines = File.ReadAllLines(@"C:\path\ajand.txt");

foreach (var line in lines) {
    var index = line.Trim().IndexOf(" ");
    if (index == -1) {
        continue;
    }

    DateTime key;
    if (DateTime.TryParseExact(line.Substring(0, index), out key)) {
        hT[key] = line.Substring(index);
    }
}
于 2012-11-29T00:20:26.740 に答える