【问题标题】:Get to next element in List获取列表中的下一个元素
【发布时间】:2011-12-31 19:39:56
【问题描述】:

如果我有一个对象列表并且我想通过每个函数调用移动到下一个节点(即创建一个“GetNextNode”我将如何去做?现在我有一个方法可以获取第一个节点我的 List 并将 currentObj 设置为它并返回它(使前一个节点仍然为空)一个标志表明我们不再处理列表中的第一个节点。然后我继续前进,我想遍历列表(我猜是使用 foreach 吗?)到我 currentObj 之后的一个节点。这是我的代码:

 List<Employee> ListOfEmployees = new List<Employee>();
 Employee currEmployeeObj = null;
 Employee prevEmployeeObj = null;

 foreach (Employee employee in ListOfEmployees)
        {
           //how do i keep track of the previous and current employee in here?
        }

        return (currEmployeeObj); 
    }

【问题讨论】:

  • 你为什么要先做这个选角?
  • 你的整个if 链是没有用的,除非你定义了自定义的显式转换(这将是非常错误的)
  • 好吧,我想在我用这种方法完成之前,我“可能”需要其他东西的演员表 - 还不确定,不需要考虑我遇到的问题不过那一刻..
  • 我正在投射,因为我可能希望稍后在此处显示特定于每个对象的信息...无论如何,我的问题是如何将一个节点从我离开的位置向前移动。 ..

标签: c# object loops foreach


【解决方案1】:

看起来你真的在重新发明一个枚举器:

public IEnumerator<Employee> GetEmployees()
{
    foreach (Employee employee in ListOfEmployees)
    {
        //custom processing here
        yield return employee;
    }
}

用法:

var myEnumerator = foo.GetEmployees();
while(myEnumerator.MoveNext())
{
    var someEmployee = myEnumerator.Current;
    //do something
}

这里的更新是完整的类实现,因此您可以验证它是否可以编译和工作..

public class Foo
{
    List<Employee> ListOfEmployees = new List<Employee>();

    public Foo()
    {
        ListOfEmployees.Add(new Employee());
    }

    public IEnumerator<Employee> GetEmployees()
    {
        foreach (Employee employee in ListOfEmployees)
            yield return employee;
    }
}

【讨论】:

  • 对不起,你的例子中的“foo”是什么?
  • foo 是实现包含所有示例代码的GetEmployees() 方法的类
  • @rich.okelly: foreach 部分未编译 - 我将示例限制为显式枚举器块,它可以很好地用于说明和编译和工作。 foreach 如果有问题的类实现 IEnumerator&lt;Employee&gt; / GetEnumerator() 将起作用
  • @rich.okelly:你的两个论点都不正确:迭代器块可以返回 either IEnumerableIEnumerator,尽管前者更常用(见即csharpindepth.com/articles/Chapter11/StreamingAndIterators.aspx)。他也不能使用列表的枚举器,因为他想在两者之间进行自定义处理
  • @BrokenGlass:他不能直接返回列表吗?
【解决方案2】:

(作为学术练习,其他答案在这里可能更合适:)

你可以像这样创建一个扩展方法:

public static IEnumerable<Tuple<T, T>> ToPairs<T>(this IEnumerable<T> enumerable)
    {
        using (var enumerator = enumerable.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                var previous = enumerator.Current;
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current;
                    yield return new Tuple<T, T>(previous, current);
                    previous = current;
                }
            }
        }
    }

返回一个包含元素对的元组。

会这样使用:

foreach (var pair in ListOfEmployees.ToPairs())
{
   Employee prevEmployee = pair.Item1;
   Employee currEmployeeObj = pair.Item2;

}

【讨论】:

    【解决方案3】:

    我讨厌听起来像恐龙,但既然您无论如何都使用 List 来实现,为什么不使用 for 而不是 foreach 对其进行迭代呢?整数对于像i == j + 1这样的比较非常有用

    【讨论】:

    • 我想一次迭代一个节点——而不是一次一个接一个地迭代(如果这是你的意思的话)。另外,我希望我的代码尽可能抽象。我认为你得到的是我最初决定的,它不是很抽象。感谢您的输入
    • 你当然可以做你所描述的——也就是说,在循环的开头设置 currEmployee ,在循环的结尾设置 prevEmployee ,可能是某种 if所以你可以忽略不符合标准的员工。我看不出这有多抽象,但肯定更难理解。
    【解决方案4】:

    http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx

    这行文本上方的链接可以解决我的问题。

    感谢大家的回复和帮助!点赞那些试图提供帮助并能提供帮助的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 2020-07-31
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多