我有一个字符串值列表,我希望将其添加到哈希表或其他可以通过键/索引访问但无法实现的数组中。我有这个工作我想要的但是它的丑陋
List<string> valueList = new List<string>();
valueList.Add("1");
valueList.Add("2");
valueList.Add("3");
Hashtable p = new Hashtable();
valueList.ForEach(delegate(string f) { p.Add(valueList.FindIndex(v => v == f), f); });
编辑:在詹姆斯提醒我列表将按索引返回值后,我选择了一个List,这就是我最终的结果
valueList.ForEach(f => sequenceList.Add(int.Parse(f)));
答案 0 :(得分:4)
即使它被编译,它也行不通 - 调用GetEnumerator().Current
总是会失败,因为它会给你一个位于第一个项目之前的 new 迭代器。
您希望每件商品的钥匙是什么?如果它只是它在列表中的位置,我看不到给你一个列表的好处(已经被int
索引)。但是,您可以这样做(假设valueList
是List<string>
:
var dictionary = valueList.Select((item, index) => new { item, index })
.ToDictionary(x => x.index, x => x.item);
将其添加到现有字典中,我只是这样做:
for (int i=0; i < valueList.Count; i++)
{
dictionary[i] = valueList[i];
}
不是所有都必须使用lambdas完成:)
请注意,如果您有重复的值,这与使用FindIndex
的效果不会完全相同。
答案 1 :(得分:1)
假设您希望字符串为键,索引为值:
Hashtable ht = new Hashtable();
for (var i = 0; i <= valueList.Count; i++)
{
ht.Add(valueList[i], i);
}
否则切换ht.Add参数。但是,如果是这种情况,您最好将其保留为List&lt; string&gt;。
答案 2 :(得分:1)
试试这个:
valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x));
虽然 没有理由在这里使用for
for (var index = 0; index < valueList.Count; index++)
{
htable.Add(index, valueList[index]);
}
这是更多的代码行,但它更直接且性能更好(findIndex远比使用for语句中的index
低效。)
答案 3 :(得分:0)
List<string> list = new List<string>{"w", "y", "u", "i", "n"};
HashSet<string> hset = new HashSet<string>(list);
答案 4 :(得分:0)
使用ForEach效率不高,因为您必须使用FindIndex来找出您的位置。它有效,但你会做很多额外的工作:
valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x));
最好只使用常规循环,这样就可以获得索引而无需查看表格:
for (int i = 0; i < valueList.Count; i++) {
htable.Add(i, valueList[i]);
}