0

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

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

编辑:在詹姆斯提醒我列表将按索引返回值之后,我选择了一个列表,这就是我最终得到的

valueList.ForEach(f => sequenceList.Add(int.Parse(f)));
4

5 回答 5

4

即使它编译了,它也不会工作——调用GetEnumerator().Current总是会失败,因为它会给你一个位于第一个项目之前的新迭代器。

您希望每个项目的密钥是什么?如果它只是它在列表中的位置,我看不出它给你带来的好处超过了一个列表(它已经被 索引了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如果您有重复的值,这与使用的效果不同。

于 2009-07-06T15:12:33.283 回答
1

假设您希望字符串是键,索引是值:

Hashtable ht = new Hashtable();

for (var i = 0; i <= valueList.Count; i++)
{
    ht.Add(valueList[i], i);
}

否则切换 ht.Add 参数。但是,如果是这种情况,您最好将其保留为 List < string >。

于 2009-07-06T15:11:22.367 回答
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 远低于使用indexfrom for 语句的效率)。

于 2009-07-06T15:16:31.063 回答
0
List<string> list = new List<string>{"w", "y", "u", "i", "n"};

HashSet<string> hset = new HashSet<string>(list);
于 2009-07-06T15:11:44.220 回答
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]);
}
于 2009-07-06T15:21:16.390 回答