比较 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);
}