![](/img/trans.png)
[英]String [] Array to a hashtable, adding a key and value from the string [] C#
[英]Adding more than one value to a single key in a hashtable in c#?
我正在尝试创建一个程序来读取具有单词及其含义的字符串
Book: Cover with Papers in between
Book: Reserve
每当我尝试我的代码时,我都会收到错误,因为每个密钥都必须是唯一的。 有办法解决这个问题吗?
Hashtable ht = new Hashtable();
var fileStream = new FileStream(@"e:\test.txt", FileMode.Open, FileAccess.Read);
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
ht.Add(line.Split(':')[0], line.Split(':')[1]);
}
}
if (ht.ContainsKey("Book"))
{
listBox1.Items.Add(ht["Book"].ToString());
}
在一般情况下,您可以使用List<string>
作为值,只需Add
到它。 但是,您可以通过ToLookup
简化LINQ:
var groups = File.ReadLines(path)
.Select(line => line.Split(':'))
.ToLookup(x => x[0], x => x[1].Trim());
现在,您可以访问groups[key]
,它为您提供具有该前缀的所有值,或者您可以foreach
通过groups
来获取.Key
和值的每个组合。
就您的代码而言,这是:
var groups = File.ReadLines(@"e:\test.txt")
.Select(line => line.Split(':'))
.ToLookup(x => x[0], x => x[1].Trim());
foreach(var val in groups["Book"])
listBox1.Items.Add(val);
(不需要先检查是否存在,如果没有匹配就可以正常工作)
然而! 如果您仍然希望在此代码之后仍然需要所有值,则只需执行此操作,即您在其他位置使用groups
。 如果你不这样做,你可以更节俭,只是放弃不需要的数据:
var values = File.ReadLines(@"e:\test.txt")
.Where(line => line.StartsWith("Book:"))
.Select(line => line.Substring(5).Trim());
foreach(var val in values)
listBox1.Items.Add(val);
编辑:次要的东西 - 一个令人烦恼的方法签名意味着line.Split(':')
实际上每次创建一个数组,因为params
; 所以我通常使用:
static readonly char[] Colon = {':'};
和
line.Split(Colon)
如果它是一条热门路径, 那么效率会显着提高。
使用字典,其中值是字符串列表:
var myDicitonary = new Dictionary<string, List<string>>
现在,您将执行以下操作:
if (!myDictionary.ContainsKey(key))
{
myDicitonary.Add(key, new List<string>());
}
myDicitonary[key].Add(value);
使用Dictionary<string, List<string>>
而不是Hashtable。
根据您想要实现的目标,您可以使用SortedList
或SortedDictionary
,您可以使用自己的IComparer
初始化,从而允许重复键。
有关详细信息,请查看这些Stackoverflow帖子:
C#可排序集合,允许重复键
是否有一个替代Dictionary / SortedList允许重复?
此解决方案的缺点是,您无法通过键访问元素,但仍然可以通过索引访问元素。
改用词典。
Dictionary<string, list<string>> dic = new Dictionary<string, list<string>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.