比较IP地址并将其从同一子网中删除

时间:2018-08-08 08:16:28

标签: c# asp.net asp.net-mvc c#-4.0 c#-3.0

我有一个用户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; }

    }

现在有人可以帮助我吗?我该如何以最简单的方式做到?

1 个答案:

答案 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);
}