使用List <t> ForEach将元素添加到HashTable </t>

时间:2009-07-06 15:07:13

标签: c# .net hashtable ienumerable enumeration

我有一个字符串值列表,我希望将其添加到哈希表或其他可以通过键/索引访问但无法实现的数组中。我有这个工作我想要的但是它的丑陋

        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)));

5 个答案:

答案 0 :(得分:4)

即使它被编译,它也行不通 - 调用GetEnumerator().Current总是会失败,因为它会给你一个位于第一个项目之前的 new 迭代器。

您希望每件商品的钥匙是什么?如果它只是它在列表中的位置,我看不到给你一个列表的好处(已经被int索引)。但是,您可以这样做(假设valueListList<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]);
}