3

我有两个要关联在一起的字符串,以便我可以按用户名搜索并获取计算机名。字符串:用户名计算机名

我对 VB 代码不是很流利,所以我不知道如何构建这个对象。这就是我认为我需要的:

(
  ("user1" "computer1")
  ("user2" "computer2")
  ("user3" "computer3")
  ("user4" "computer4")
  ("user5" "computer5")
)

然后我希望能够通过询问来查询列表:什么计算机名与“user3”相关联?结果得到“computer3”。

4

5 回答 5

4

您正在寻找一个System.Collections.Generic.Dictionary. 具体来说一个Dictionary(Of String, String).

Add一次一个项目:

Dim computers As New Dictionary(Of String, String)
computers.Add("user1", "computer1")
computers.Add("user2", "computer2")
'...

或者,您可以使用初始化程序并一举完成:

Dim computers As New Dictionary(Of String, String) From
    {
      {"user1" "computer1"},
      {"user2" "computer2"},
      {"user3" "computer3"},
      {"user4" "computer4"},
      {"user5" "computer5"}
    }

并使用索引器访问单个元素:

Dim result As String = computers("user3")

请注意,如果集合中不存在“user3”,这将引发异常。您可能希望查看TryGetValue是否有可能搜索不存在的密钥。

于 2013-10-23T14:39:38.090 回答
1

我想有可能不止一个用户使用一台计算机,并且多个用户可以使用一台特定的计算机。在这种情况下,拥有一个保存用户与计算机相关信息的类可能会更简单。然后,您可以创建该类的实例列表来保存整个信息集,并且作为列表,您可以使用 LINQ 轻松查询它,如下所示:

Option Infer On
Module Module1

    Dim computerUsers As New List(Of ComputerUser)

    Class ComputerUser
        Property ComputerName As String
        Property UserName As String
    End Class

    Sub CreateTestData()
        computerUsers = New List(Of ComputerUser)
        computerUsers.Add(New ComputerUser With {.ComputerName = "PC1", .UserName = "Fred"})
        computerUsers.Add(New ComputerUser With {.ComputerName = "PC2", .UserName = "Jim"})
        computerUsers.Add(New ComputerUser With {.ComputerName = "PC3", .UserName = "Jane"})
        computerUsers.Add(New ComputerUser With {.ComputerName = "PC1", .UserName = "Jim"})

    End Sub

    Sub Main()
        CreateTestData()

        Dim pcName = "PC1"
        Dim thisPcUsers = computerUsers.Where(Function(x) x.ComputerName = pcName).Select(Function(y) y.UserName).ToList()
        Console.WriteLine(pcName & " is used by: " & String.Join(", ", thisPcUsers))

        Dim user = "Jim"
        Dim thisUserPCs = computerUsers.Where(Function(x) x.UserName = user).Select(Function(y) y.ComputerName).ToList()
        Console.WriteLine(user & " uses computers: " & String.Join(", ", thisUserPCs))

        Console.ReadLine()

    End Sub

End Module

哪个输出

PC1 is used by: Fred, Jim
Jim uses computers: PC2, PC1

编辑+1 给赛斯,我在写这篇文章时没有看到他的回答。

编辑 2您可以通过各种方式使用 LINQ,例如获取名称以“J*”开头的用户:

Dim partialName = "J*"
Dim usersWithWildcard = computerUsers.Where(Function(x) x.UserName Like partialName).ToList()

Console.WriteLine("Users starting with " & partialName)
For Each u In usersWithWildcard
    Console.WriteLine(u.UserName)
Next
于 2013-10-23T20:58:01.220 回答
1

虽然使用字典的答案肯定会起作用,但我个人更喜欢使用类和列表。

你会做这样的事情:

Public Class UserComputer
    Private _user As String
    Public Property User() As String
        Get
            Return _user
        End Get
        Set(ByVal value As String)
            _user = value
        End Set
    End Property

    Private _comp As String
    Public Property Computer() As String
        Get
            Return _comp
        End Get
        Set(ByVal value As String)
            _comp = value
        End Set
    End Property

    Public Sub New(User As String, Computer As String)
      Me.User = User
      Me.Computer = Computer
    End Sub

End Class

Public Sub Main()
  Dim myList As New List(Of UserComputer)
  myList.Add(New UserComputer("user1", "computer1")
  '... keep adding objects
End Sub

UserComputer这里的好处是,如果你需要扩展你的类变得非常容易;只需向类添加更多属性。它还让您可以轻松地使用程序其他部分的对象中的信息。

于 2013-10-23T18:49:22.720 回答
0

我怀疑你想要的是Dictionary(Of String, String)

Dim x as New Dictionary(Of String, String)
x.Add("user1", "computer1") ' etc...

Dim computer as String = x("user1")
于 2013-10-23T14:40:10.907 回答
0
Dim userComputers As New Dictionary(Of String, String) From
{   
   {"user1" "computer1"},
   {"user2" "computer2"},
   {"user3" "computer3"},
   {"user4" "computer4"},
   {"user5" "computer5"}
}

Dim computer As String = userComputers("user3")
于 2013-10-23T14:41:52.360 回答