我有一个用户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 /城市的所有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 ip,例如:
192.168.0.1 (again doesn't matter which one is left, just that 1 is left!)
现在进入带有代码的零件。我有一个如下的类结构:
public class SortedUser
{
public string Email { get; set; }
public List<IpInfo> IPAndCountries = new List<IpInfo>();
}
IPInfo类如下所示:
public class IpInfo
{
public string Ip { get; set; }
}
现在有人可以帮助我吗?我该如何以最简单的方式做到?
答案 0 :(得分:1)
如果仅在地址列表中查找前两个字节,则可以像这样运行字符串比较(未经测试):
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);
}