IPアドレスが特定の範囲内にあるかどうかを確認したいのですが、一致する"*"
だけです。たとえば、「202.121.189.8」は「202.121.189」にあり*
ます。
シナリオでは、禁止されているIPのリストがあり、そのうちのいくつかにはが含まれている"*"
ため、関数を作成しました。これまでのところ正常に機能しています。
static bool IsInRange(string ip, List<string> ipList)
{
if (ipList.Contains(ip))
{
return true;
}
var ipSets = ip.Split('.');
foreach (var item in ipList)
{
var itemSets = item.Split('.');
for (int i = 0; i < 4; i++)
{
if (itemSets[i] == "*")
{
bool isMatch = true;
for (int j = 0; j < i; j++)
{
if (ipSets[i - j - 1] != itemSets[i - j - 1])
{
isMatch = false;
}
}
if (isMatch)
{
return true;
}
}
}
}
return false;
}
テストコード:
string ip = "202.121.189.8";
List<string> ipList = new List<string>() { "202.121.168.25", "202.121.189.*" };
Console.WriteLine(IsInRange(ip, ipList));
しかし、私が書いたものは非常にばかげていると思います、そして私はそれを最適化したいです、誰かがこの機能を単純化する方法を知っていますか?「for....if...」をあまり使用しないでください。