什么是java Vector.element()C#等价物

时间:2011-11-10 05:36:19

标签: c# java

这是我未完全尝试翻译的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!!
    }

请帮忙!

3 个答案:

答案 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(); }