从文件c#读取哈希表

时间:2012-11-28 20:21:51

标签: c#

(在这个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 个答案:

答案 0 :(得分: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&lt;&gt;代替。

以上是上述函数的一个版本,它使用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;
}

答案 1 :(得分: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(); 
        }            
    }

答案 2 :(得分: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;
}

答案 3 :(得分: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);
    }
}