这是我未完全尝试翻译的java代码
static Enumeration enumerate()
{
Vector list = new Vector();
Enumeration e = cache.keys();
while (e.hasMoreElements())
{
Vector v = (Vector) cache.get(e.nextElement());
for (int i = 0; i < v.size(); i++)
{
list.addElement(v.elementAt(i));
}
}
return list.elements();
}
这是C#翻译但不完整
public static IEnumerable<Http> enumurate()
{
List<Http> list = new List<Http>();
IEnumerator e = cache.Keys.GetEnumerator();
while (e.MoveNext())/*While e has more element*/
{
var vector = (List<Http>)cache[e.Current];
for (int i = 0; i < vector.Count; i++)
{
list.Add(vector.ElementAt<Http>(i));
}
}
return //Something missing!!
}
请帮忙!
答案 0 :(得分:8)
在C#List<Http>
实施IEnumerable<Http>
,您只需返回列表:
return list;
要将代码转换为C#,您可以跳过向列表添加元素并直接生成结果:
public static IEnumerable<Http> enumerate()
{
IEnumerator e = cache.Keys.GetEnumerator();
while (e.MoveNext())/*While e has more element*/
{
var vector = (List<Http>)cache[e.Current];
for (int i = 0; i < vector.Count; i++)
{
yield return vector.ElementAt<Http>(i);
}
}
}
此外,您可以避免直接使用枚举器并使代码更具可读性:
public static IEnumerable<Http> enumerate()
{
foreach (var key in cache.Keys)
{
foreach (var http in (List<Http>)cache[key])
{
yield return http;
}
}
}
答案 1 :(得分:2)
只需返回本地list
即可。 List<T>
实施IEnumerable<T>
。
答案 2 :(得分:0)
在C#中,您可以使用LINQ来简化代码:
public static IEnumerable<Http> enumerate()
{ return cache.Keys.SelectMany(key => (List<Http>)cache[key]); }
假设cache
被声明为Dictionary<..., List<Http>>
,您可以使用Values
属性来避免密钥查找:
public static IEnumerable<Http> enumerate()
{ return cache.Values.SelectMany(list => list); }
上面和现在的代码之间的一个重要区别是,在您实际尝试迭代返回的集合之前,不会对上述内容进行评估。如果您想立即评估结果,可以添加对.ToList()
的调用。这相当于您的原始代码:
public static IEnumerable<Http> enumerate()
{ return cache.Keys.SelectMany(key => (List<Http>)cache[key]).ToList(); }