Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使每个应用程序只得到一个结果而不是两个?_Vb.net_Windows Firewall - Fatal编程技术网

Vb.net 如何使每个应用程序只得到一个结果而不是两个?

Vb.net 如何使每个应用程序只得到一个结果而不是两个?,vb.net,windows-firewall,Vb.net,Windows Firewall,将此复制到VisualStudio中,添加一个文本框,它就会运行 Const NET_FW_ACTION_ALLOW = 1 Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2") Dim RulesObject = fwPolicy2.Rules For Each rule In RulesObject If rule.action = NET_FW_ACTION_ALLOW Then TextBox1.Text += ru

将此复制到VisualStudio中,添加一个文本框,它就会运行

Const NET_FW_ACTION_ALLOW = 1
Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
Dim RulesObject = fwPolicy2.Rules

For Each rule In RulesObject
    If rule.action = NET_FW_ACTION_ALLOW Then
        TextBox1.Text += rule.name & vbnewline
    End If
Next
这是我得到的一个例子,但我只需要每个应用程序列出一次,而不是两次。我做错了什么,为什么会这样

qBittorrent
qBittorrent
Chrome
Chrome
Visual Studio
Visual Studio
and so on...
以上是一种方法。它只是检查是否已经添加到文本框中。顺便说一句,我不知道
规则.name
是否已经是一个字符串,所以我添加了
.ToString
;如果它已经是一个字符串,则无需添加该字符串


此外,我们大多数人都建议使用
选项Strict
,并将变量声明为类型。i、 e.
Dim myVar as String=“some String”

其行为类似于此,因为
规则.Name
不是防火墙规则的唯一标识符。相同的规则名称可用于不同的协议(TCP、UDP)、配置文件(域、专用、公用)、方向(输入、输出)等。如果您只对
规则感兴趣。名称
,请将它们添加到一个集合中,然后打印该集合,如下所示

Const NET_FW_ACTION_ALLOW = 1
Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
Dim RulesObject = fwPolicy2.Rules
Dim names As New HashSet(Of String)

' Create set of unique names.
For Each rule In fwPolicy2.Rules
    If rule.action = NET_FW_ACTION_ALLOW Then
        names.Add(rule.name)
    End If
Next

' Add names to TextBox.
For Each name As String In names
    TextBox1.Text += name & vbNewLine
Next


谢谢你的快速回复。这当然是一个很好的方法。我很好奇是否还有其他方法。而且,我仍然很好奇为什么它的行为如此。我比你投了更高的票,但因为我是新来的,所以还没有表现出来。我相信,通过理解它为什么表现得如此,人们可以找到一个更坚实的解决方案。你怎么认为?我有一个理论。可能结果针对入站和出站规则,因此会产生双重结果。但我不知道如何证明这个理论,很有可能。有一种快速的方法来检验理论;为某些应用程序创建入站或出站规则,并省略相反的规则,然后再次检查代码,查看是否只显示1项。;)仔细查看代码,您只测试
NET\u FW\u ACTION\u ALLOW
;这意味着一个应用程序的入站和出站规则都可能被设置为允许,所以当它们都被设置为允许时,它可能同时显示入站和出站规则。如果您正在寻找其他要测试的值,则应该仔细检查
规则
对象。测试了此理论,是的,它是正确的。如果只有一个入站或出站规则,那么我只收到一个名称。为什么对字符串同时使用+和&呢?对于字符串,仅使用&。在文本框中添加内容时,你也可以使用AppendText。哦,你的意思是这样的
TextBox1.AppendText(rule.name&vbNewLine)
感谢您的提示。另一个小提示:您可以使用
Environment.NewLine
,而不是“老派”的
vbNewLine
,这是我个人一直喜欢的,因为它使事情面向对象。我测试了这个代码。它只提供了一个我想要的应用程序名称,但我不知道为什么。除了
hashset
之外,它与我的代码没有太大的不同,那么在这段代码中是什么做的,以及如何做的呢?好的,用谷歌搜索一下:“hashset类存储非重复项”。很好。@user11903887-将元素添加到哈希集中需要持续时间,也就是说,不必扫描该集中已经存在的所有元素来确定元素是否已经存在。这就是为什么我建议使用set,以提高其性能。搜索文本框中是否已存在名称。文本所需时间与文本长度成比例,并且随着每个名称的附加,该长度会增加。因此,搜索时间不是恒定的,而是与文本长度成比例的。@user11903887请单击答案左侧的复选标记(勾号)接受Robert的答案。@user11903887-您误解了我的评论。相反,斯科特的答案是二次时间复杂度,而我的答案是线性的。线性比二次快。线性意味着如果有n条规则,则执行时间与n成正比。量子意味着它与n^2(nxn)成正比。
Const NET_FW_ACTION_ALLOW = 1
Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
Dim RulesObject = fwPolicy2.Rules
Dim names As New HashSet(Of String)

' Create set of unique names.
For Each rule In fwPolicy2.Rules
    If rule.action = NET_FW_ACTION_ALLOW Then
        names.Add(rule.name)
    End If
Next

' Add names to TextBox.
For Each name As String In names
    TextBox1.Text += name & vbNewLine
Next