(在这个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);
}
但是当我运行该程序时,相应的文本框中没有填充“似乎”已添加到哈希表中的数据。 请问任何想法是什么问题。
答案 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);
}
}