使用IEnumerable(Of String)从不同类型的数据源中读取

时间:2014-10-29 18:56:51

标签: vb.net

我使用以下变量来存储用户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。

2 个答案:

答案 0 :(得分:3)

可以使用ListBox.Items属性访问ListBox控件的内容。它返回一个ListBox.ObjectCollection对象,该对象实现IListICollectionIEnumerable

这假设您已经以编程方式添加了内容,而不是绑定到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变量来引用所有这些变量。