我有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()之前使用了什么?我该如何实现呢?
答案 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>
我就是这样做的:
var keys = new int[testimonialDictionary.Count];
testimonialDictionary.Keys.CopyTo(keys, 0);
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;
}
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())