【问题标题】:Does For Each on List return items in order of addition?For Each on List 是否按添加顺序返回项目?
【发布时间】:2016-01-06 00:25:44
【问题描述】:

如果我将项目添加到 List(Of T),然后使用 For Each 对其进行迭代,是否可以保证以与添加顺序相同的顺序访问它们?

或者就此而言,它们是否添加在与添加顺序相关的索引处? (即在索引 0 处添加的第一个对象,在索引 1 处添加第二个对象,依此类推)

例如:下面的代码是否可以保证从两个循环中打印输出“0 1 2”?

Private MyList As New List(Of Integer)
MyList.Add(New Integer(0))
MyList.Add(New Integer(1))
MyList.Add(New Integer(2))

For Each n As Integer In MyList
    Console.Write(n.ToString & " ")
Next

For i As Integer = 0 To MyList.Count - 1
    Console.Write(MyList(i).ToString & " ")
Next

编辑:感谢您指出此问题的第一部分已由In what order does a C# for each loop iterate over a List<T>?

回答

但是,第二部分进一步限定了这个问题。链接的问题指出是的,For Each 从索引0 迭代到索引count - 1。但是 .Add() 方法是否总是在下一个未使用的最高索引处添加?

【问题讨论】:

标签: vb.net list foreach vb.net-2010


【解决方案1】:

是的,每个添加到 List 的元素都会获得更高的索引。所以第一个总是 0,第二个 1 等等。 Foreach 将始终从头到尾循环列表。如果您喜欢从头开始,您可以使用 FOR 循环,或者您可以按照您喜欢的方式对列表进行排序(例如 LINQ)。

验证这一点的最简单方法就是调试您的代码。 使用您提供的代码(稍作修改):

    Sub Main()
    Dim MyList As New List(Of Integer)
    MyList.Add(0)
    MyList.Add(1)
    MyList.Add(2)

    For Each n As Integer In MyList
        Console.Write(n.ToString & " ")
    Next

    For i As Integer = 0 To MyList.Count - 1
        Console.Write(MyList(i).ToString & " ")
    Next

    Console.Read()
End Sub

输出将是:

0 1 2 0 1 2

如果你想在中间某处插入一个元素,你可以使用:

MyList.Insert(position, value)

【讨论】:

  • Keran,有这方面的文档参考吗?我一直在阅读的 MSDN 页面偏向于谈论排序,而不是提及任何关于排序的细节。
  • 是的,这里是:msdn.microsoft.com/en-us/library/3wcytfd1(v=vs.110).aspx"要添加到列表end的对象"
  • Ta,错过了那一点点!
猜你喜欢
  • 2010-10-01
  • 2011-05-05
  • 2018-12-24
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多