我使用以下变量来存储用户ID字符串列表。然后,我使用该列表使用LDAP查询搜索每个用户。
Dim userIds As IEnumerable(Of String) =
{"testid1", "testid2", "testid3", "testid4", "testid5"}
这有效,但ID是硬编码的。如何让它从ListBox
控件中读取ID?它会是这样的:
Dim userIds As IEnumerable(Of String) = ListBox1???
我想使用ListBox
,因为我打算从文本文件中加载ListBox
一堆ID。
更好的是,是否可以使用TextBox
?如果是TextBox
,我可以复制并粘贴我需要查询的ID。
答案 0 :(得分:3)
可以使用ListBox.Items
属性访问ListBox
控件的内容。它返回一个ListBox.ObjectCollection
对象,该对象实现IList
,ICollection
和IEnumerable
。
这假设您已经以编程方式添加了内容,而不是绑定到DataSource。如果您绑定到DataSource,正如LarsTech建议的那样,您应该使用ListBox.DataSource
。
如果您想使用TextBox
控件,则必须以某种方式手动分隔每个ID。您可以通过每行只放置一个ID来执行此操作,然后使用Split
方法获取每个ID:
Dim ids as String() = myTextBox.Text.Split(new String() { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
答案 1 :(得分:1)
我打算把它写成评论,但是它有点长并且开始涉及代码示例,所以我认为将它作为答案发布会更好,即使已经有一个已经接受的答案非常好
由于我是最初给你使用IEnumerable
的代码的人,我觉得我应该解释为什么我使用它... IEnumerable
是所有人实现的最低级别接口列表,集合,字典,数组等。基本上,任何存储可以通过For Each
循环循环的多个数据的东西都会实现IEnumerable
接口。事实上,IEnumerable
接口支持的唯一功能就是能够通过For Each
循环枚举其内容。 IEnumerable
只是一个接口,它不是具体的对象类型。因此,当您创建IEnumerable
变量时,这意味着该变量可用于引用(即指向)实现该接口的任何对象(即可以使用For Each
循环枚举的任何对象。
因此,在以下行中,它不会创建IEnumerable
类型的对象。或者至少不是具体的感觉。它创建了一个特定类型的对象,恰好实现了IEnumerable
接口,然后将ids
变量设置为指向它。
Dim userIds As IEnumerable(Of String) = {"1", "2", "3"}
短语{"1", "2", "3"}
实际上是一个表示字符串数组的文字表达式。换句话说,该文字表达式相当于执行以下操作:
Dim stringArray(2) As String
stringArray(0) = "1"
stringArray(1) = "2"
stringArray(2) = "3"
因此,由于包含ID列表的对象实际上是一个字符串数组,因此可以这样做:
Dim userIds() As String = {"1", "2", "3"}
但是,由于我希望代码能够工作,无论数据源如何,我都使用了更通用的IEnumerable
接口。由于我实际需要的唯一数据是它可以使用For Each
循环枚举,我不想通过要求ID的输入列表更高一些来限制代码的灵活性级别特定对象类型。我并不在乎ID的具体是数组,列表,字典或集合。只要它是我可以循环的东西,这就是我所关心的。通过这样做,这使代码更加灵活,以便您可以将变量设置为任何可枚举的数据源,例如Items
的{{1}}属性。例如,以下所有内容都可以工作,而无需更改其余代码:
ListBox
或者
Dim userIds As IEnumerable(Of String) = {"1", "2", "3"}
或者
Dim userIdsArray() As String = {"1", "2", "3"}
Dim userIds As IEnumerable(Of String) = userIdsArray
或者
Dim userIdsArray(2) As String
userIdsArray(0) = "1"
userIdsArray(1) = "2"
userIdsArray(2) = "3"
Dim userIds As IEnumerable(Of String) = userIdsArray
或者
Dim userIds As IEnumerable(Of String) = ListBox1.Items.OfType(Of String)()
或者
Dim userIds As IEnumerable(Of String) = File.ReadAllLines("IDs.txt")
等
由于上述所有数据源都实现了Dim userIds As IEnumerable(Of String) = TextBox1.Text.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
接口,因此可以使用相同的IEnumerable
变量来引用所有这些变量。