2017-06-16 62 views
0

因此,今天我正在爲我正在製作的程序提供一些知識產權保護。使用循環的IP保護,C#

IP白名單託管在pastebin上。

我的程序會下載這些IP,並將它拆分爲一個字符串數組。

我的程序還檢查使用https://wtfismyip.com/text

我想要做的是比較從陣列中的每個字符串,並檢查它是否是當前的IP的IP。

如果IP最後不是當前IP,則它將關閉。

我會怎麼做呢?代碼的

實施例:

for (int i = 0; i < iplist.Length; i++) 
    { 
     if(iplist[i] == WebIP) 
     { 
      MessageBox.Show("Passed"); 
     } 
     else 
     { 
      this.Close(); 
     } 
    } 
+0

在進入循環之前,您需要一個設置爲false的布爾變量。當你發現你的IP將這個變量設置爲true並且打破for循環。在這一點上,你會知道如果你找到了IP – Steve

+0

這個白名單多久了? –

+0

@EdPlunkett不長,也許10個IP長 –

回答

1

可以使用一些LINQ使代碼更易讀:

if (iplist.Any(ip => ip == WebIP)) 
{ 
    MessageBox.Show("Passed"); 
} 
else 
{ 
    this.Close(); 
} 
+1

或只是...'.Contains(WebIP)'? –

+0

@MarcGravell這也可以完成這項工作,但似乎這樣做更爲迫切,至少對我來說是這樣。 – Deadzone

+0

雖然我會保持謹慎, LINQ對它可以高效地執行的事情有多種特殊情況優化 - 對'.Count()'等進行ICollection;現在不是這種情況*,但我不排除'包含(T val)'檢查「ISet 」,這意味着它將自動針對一系列常見情況進行優化, 'Any(x => x == y)'*將不能使用*,*和*涉及帶上下文捕獲對象的代理創建 –

0

你可以有一個標誌,並相應地將其設置像

bool flag = false; 
    for (int i = 0; i < iplist.Length; i++) 
    { 
    if(iplist[i] == WebIP) 
    { 
     flag = true; 
     break; 
    } 
    } 

if(flag) 
    MessageBox.Show("Passed"); 
else 
    this.Close(); 
1

假設你要測試很多次,創建一個白名單(或類似的黑名單)的HashSet<T>;假設它是一個string

var whiteList = new HashSet<string>(iplist); 

(這樣做一次,而不是你需要檢查每一個時間)

然後只檢查.Contains

bool isOK = whiteList.Contains(WebIP); 

完成任務,並且非常有效地

+0

這是一個非常好的主意,由於Contains成爲O 1)的操作,但是'Hashset '聲明呢?這本身不是O(n)操作嗎?這應該仍然會導致相同的性能,就像你使用簡單的'.Any(Predicate )'。可能更糟糕。 – Deadzone

+0

如果元素位於索引0,重新創建整個集合會更糟糕。 – Deadzone

+0

@Deadzone通常情況下,您使用相同的白名單來處理許多請求,在這種情況下,O(N)的初始成本既準確又不相關:)提及「WebIP」表明這是一個Web服務器,這使得這更有可能處理多個請求 –