循环列表并保持索引计数VB.net

时间:2018-04-18 15:21:49

标签: vb.net

如何通过vb.net中的列表/数组进行审核,并保留当前项目的计数,而不必声明显式的计数器变量?

我想要达到的结果如下。

dim i as integer = 0 'evil counter variable
dim arr() as string = {"a","b","c","d","e"}
for each item in arr
    console.writeline("Item """ & item & """ is index " & i)           
    i+=1
next

无需在自己的行上声明“i”

Python有一种速记方式,如下所示。

arr=["a","b","c","d","e"]
for i, item in enumerate(arr):
    print("Item """ + item + """ is index " + str(i))

vb.net中的类似实现将是理想的。

修改

代码的重要部分是枚举。不是印刷价值。

4 个答案:

答案 0 :(得分:0)

它不如Python方式好,但这可以按照您的要求进行:

dim arr() as string = {"a","b","c","d","e"}
for i as integer = 0 to arr.length - 1
    console.writeline("Item """ & arr(i) & """ is index " & i)           
next

同样,不是那么干净,但它可以根据需要进行:)

答案 1 :(得分:0)

Dim arr() As String = {"a", "b", "c", "d", "e"}
For i = 0 To arr.GetUpperBound(0)
    Debug.Print($"Item {arr(i)}  is index {i}")
Next

答案 2 :(得分:0)

作为替代方案,您可以在Linq private void button1_Click(object sender, EventArgs e) { string path = "C:\\temp\\Accounts.xml"; XmlDocument doc = new XmlDocument(); doc.Load(path); XmlElement root = doc.CreateElement("Login"); XmlElement user = doc.CreateElement("user"); user.InnerText = textBox1.Text; root.AppendChild(user); doc.DocumentElement.AppendChild(root); doc.Save(path); MessageBox.Show("Created SuccesFully!"); } private void button2_Click(object sender, EventArgs e) { XmlDocument xdoc = new XmlDocument(); xdoc.Load("C:\\temp\\Accounts.xml"); foreach (XmlNode person in xdoc.SelectNodes("/Login")) { MessageBox.Show(person["user"].InnerText); } } 上使用string.Join()

Select()

答案 3 :(得分:0)

如果没有Reflection hack,可能的解决方案列表就不会完整,所以让我们去老学校并使用一个枚举器

Dim arr() As String = {"a", "b", "c", "d", "e"}
Dim enumer As IEnumerator = arr.GetEnumerator
Dim fi As Reflection.FieldInfo = enumer.GetType.GetField("_index", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
While enumer.MoveNext
    Dim item As String = DirectCast(enumer.Current, String)
    Console.WriteLine($"item: {item} is at index: {fi.GetValue(enumer)}")
End While

需要一点解释。 arr.GetEnumerator会返回SZArrayEnumerator。此枚举器使用私有字段_index来跟踪枚举器返回的项的数组索引。该代码使用反射来访问_index的值。

由于这不是通用的枚举器,Current属性返回的类型为System.Object,需要转换回String