比较 IP 地址并从同一子网中删除 IP 地址
Comparing IP's addresses and removing the ones from the same subnet
我有一个用户 IP 地址列表,如下所示:
user 1:
192.168.1.1
192.168.1.2
192.168.1.3
user 2:
192.168.1.1
192.168.1.2
192.168.1.3
172.0.0.1
172.0.0.5
174.5.5.15
现在我想在这里做的是从相同的 PC/City.
中过滤掉所有明显来自相同 subnet/coming 的 IP
这里我只是以本地 IP 为例。
过滤后我会得到以下内容:
对于用户 1,每个子网只有 1 个 IP 就足够了,如下所示:
192.168.1.1 => all other IP's would be removed, only one would be left
from that specific subnet
对于用户 2:
192.168.1.1
172.0.0.1
174.5.5.15
对于用户 2,自 192.168.. 和 172.0.. 以来,我还剩下 3 个 IP .
现在我的想法是对要比较的IP的前两个数字使用一个标准。例如:
192.168.0.1
192.168.0.2
192.168.0.6
这 3 个的前两个数字相同 (192.168),因此我可以认为它们是重复的,应该将它们删除。这些IP到底剩下哪1个无关紧要,重要的是只剩下1个。
这样会导致剩下1个ip,例如:
192.168.0.1 (again doesn't matter which one is left, just that 1 is left!)
现在进入代码部分。我有一个 class 结构,如下所示:
public class SortedUser
{
public string Email { get; set; }
public List<IpInfo> IPAndCountries = new List<IpInfo>();
}
IPInfo class 看起来像这样:
public class IpInfo
{
public string Ip { get; set; }
}
现在有人可以帮我解决这个问题吗?我怎样才能以最简单的方式做到这一点?
如果您只查找地址列表中的前两个字节,您可以运行像这样的字符串比较(未测试):
SortedUser user = new SortedUser()
{
Email = "Foo@bar.com",
IPAndCountries = new List<IpInfo>()
{
new IpInfo() {Ip = "192.168.0.1"},
new IpInfo() {Ip = "192.168.1.2"},
new IpInfo() {Ip = "193.168.3.2"},
new IpInfo() {Ip = "8.2.4.5"}
}
};
// Using ToArray to avoid collection modified errors
foreach (IpInfo item in user.IPAndCountries.ToArray())
{
string[] ipSplit = item.Ip.Split('.');
string prefix = $"{ipSplit[0]}.{ipSplit[1]}";
user.IPAndCountries.RemoveAll(info => info.Ip.StartsWith(prefix) && info.Ip != item.Ip);
}
我有一个用户 IP 地址列表,如下所示:
user 1:
192.168.1.1
192.168.1.2
192.168.1.3
user 2:
192.168.1.1
192.168.1.2
192.168.1.3
172.0.0.1
172.0.0.5
174.5.5.15
现在我想在这里做的是从相同的 PC/City.
中过滤掉所有明显来自相同 subnet/coming 的 IP这里我只是以本地 IP 为例。
过滤后我会得到以下内容:
对于用户 1,每个子网只有 1 个 IP 就足够了,如下所示:
192.168.1.1 => all other IP's would be removed, only one would be left
from that specific subnet
对于用户 2:
192.168.1.1
172.0.0.1
174.5.5.15
对于用户 2,自 192.168.. 和 172.0.. 以来,我还剩下 3 个 IP .
现在我的想法是对要比较的IP的前两个数字使用一个标准。例如:
192.168.0.1
192.168.0.2
192.168.0.6
这 3 个的前两个数字相同 (192.168),因此我可以认为它们是重复的,应该将它们删除。这些IP到底剩下哪1个无关紧要,重要的是只剩下1个。
这样会导致剩下1个ip,例如:
192.168.0.1 (again doesn't matter which one is left, just that 1 is left!)
现在进入代码部分。我有一个 class 结构,如下所示:
public class SortedUser
{
public string Email { get; set; }
public List<IpInfo> IPAndCountries = new List<IpInfo>();
}
IPInfo class 看起来像这样:
public class IpInfo
{
public string Ip { get; set; }
}
现在有人可以帮我解决这个问题吗?我怎样才能以最简单的方式做到这一点?
如果您只查找地址列表中的前两个字节,您可以运行像这样的字符串比较(未测试):
SortedUser user = new SortedUser()
{
Email = "Foo@bar.com",
IPAndCountries = new List<IpInfo>()
{
new IpInfo() {Ip = "192.168.0.1"},
new IpInfo() {Ip = "192.168.1.2"},
new IpInfo() {Ip = "193.168.3.2"},
new IpInfo() {Ip = "8.2.4.5"}
}
};
// Using ToArray to avoid collection modified errors
foreach (IpInfo item in user.IPAndCountries.ToArray())
{
string[] ipSplit = item.Ip.Split('.');
string prefix = $"{ipSplit[0]}.{ipSplit[1]}";
user.IPAndCountries.RemoveAll(info => info.Ip.StartsWith(prefix) && info.Ip != item.Ip);
}