.NET 3.5之前的Dictionary中的ElementAt方法

时间:2015-01-13 00:35:21

标签: c# .net dictionary

我有Dictionary<int, DataRow>使用ElementAt()方法。它在.NET 3.5及更高版本中运行良好。但是,我的ISP似乎正在运行一些不了解该方法的.NET 3.5前版本,导致以下错误:

  

编译器错误消息:CS0117:&#39; System.Collections.Generic.Dictionary&lt; int,System.Data.DataRow&gt;&#39;不包含&#39; ElementAt&#39;

的定义

我需要使用ElementAt的原因是因为我想选择随机字典元素,然后删除该元素,直到所有元素都被随机显示

                int key = testimonialDictionary.ElementAt(rnd).Key;
... do something with the Value / DataRow
                testimonialDictionary.Remove(key);

我的问题是,人们在ElementAt()之前使用了什么?我该如何实现呢?

3 个答案:

答案 0 :(得分:3)

我相信这是实现它的简单方法

string ElementAt(Dictionary<string,string> dict, uint index)
{   
    if(dict.Count > index)
    {
        uint iCnt =0;
        foreach(KeyValuePair<string,string> val in dict)
        {
            if(index == iCnt)
                return val.Key;
            iCnt++;
            if(index < iCnt)
               return null;
       }
   }
   return null;
}

测试

Dictionary<string,string> dict = new Dictionary<string,string>{{"A","1"},{"B","2"},{"C","3"},{"D","4"},{"E","5"}};

for(uint i=0;i<5;i++)
    Console.WriteLine(ElementAt(dict,i));

答案 1 :(得分:1)

基于您希望以随机顺序所有字典元素的事实

  

我想选择随机字典元素,然后删除该元素,直到所有元素都随机显示

...一次一个地获得一个键的答案最终为O(n ^ 2),因为它是O(n)得到一个键而你必须做O(n)次。 / p>

我就是这样做的:

  1. 将所有字典键输出到数组中。在LINQ之前,这仍然是可能的,但我确实需要查阅它!
  2. var keys = new int[testimonialDictionary.Count];
    testimonialDictionary.Keys.CopyTo(keys, 0);
    
    1. 在键阵列上执行Fisher-Yates shuffle以将键置于随机顺序。
    2. var r = new Random();
      for (int i = keys.Length - 1; i > 0; i--)
      {
          var putIntoI = r.Next(i + 1);
          var temp = keys[putIntoI];
          keys[putIntoI] = keys[i];
          keys[i] = temp;
      }
      
      1. 按照这个随机顺序迭代键,根据需要显示它们(如果你真的需要)也将它们从字典中删除。
      2. for (int i = 0; i < keys.Length; i++)
        {
            // Display the key and/or its corresponding value
            Display(keys[i], testimonialDictionary[keys[i]]);
        
            // Remove the item from the dictionary if you have to
            testimonialDictionary.Remove(keys[i]);
        }
        

答案 2 :(得分:-1)

我们如何更加蟒蛇风格:

int key = testimonialDictionary.Keys.ToArray()[rnd];

testimonialDictionary.Remove(key);

确保你的rnd不大于你减去一个或小于0的键数!!

更新:正如somone所指出的那样,。ToArray()也是linq,所以请改用:

int i = 0;
int? key = null
foreach(int k in testimonialDictionary.Keys){
    if(i==rnd){
        key = k;
        break;
    }
    i++;
}
testimonialDictionary.Remove(key)

(遗憾的是你不能在3.5中使用.Skip())