【问题标题】:Use List<T>ForEach to add element to HashTable使用 List<T>ForEach 将元素添加到 HashTable
【发布时间】:2010-11-08 10:05:04
【问题描述】:

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

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

【问题讨论】:

  • 你想在这里做什么?从列表中构建一个哈希表,将索引映射到键?
  • 我很难看到你所做的事情的好处?如果您只是对其进行索引,为什么不将其保留为 List 呢?
  • 已决定将其保留为列表,谢谢

标签: c# .net hashtable ienumerable enumeration


【解决方案1】:

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

您希望每个项目的密钥是什么?如果它只是它在列表中的位置,我看不到给您带来列表的好处(它已经被int 索引)。但是,您可以这样做(假设valueListList&lt;string&gt;

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 的效果不同。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 我会比这更直接 - 直接在 for 循环中查询 valueList.Count。性能差异可以忽略不计,代码更简单。
    • @Jon Skeet,好点。我将 for 循环代码合并为两行。
    【解决方案3】:

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

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

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

    【讨论】:

    • 是的,可以,只是想知道内置的 List.ForEach 是否可以做同样的事情
    • 如果你想让 ht[index] 返回一个字符串,那么我建议你使用 Mitch Wheat 的解决方案。如果相反,即 ht[string] 返回索引,那么我建议使用地雷。
    【解决方案4】:
    List<string> list = new List<string>{"w", "y", "u", "i", "n"};
    
    HashSet<string> hset = new HashSet<string>(list);
    

    【讨论】:

      【解决方案5】:

      为此使用 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]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2014-08-14
        • 2013-01-07
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多