Генерация ip из диапазонов. Менее ресурсоемкая

Рейтинг: 1Ответов: 1Опубликовано: 01.12.2014

Доброго времени суток. Встал вопрос о генерации ip адресов из диапазонов ip адресов. Нашел на просторах интернета данный метод:

public static List<IPAddress> IPAddressesRange(IPAddress firstIPAddress, IPAddress lastIPAddress)
        {
            var firstIPAddressAsBytesArray = firstIPAddress.GetAddressBytes();

            var lastIPAddressAsBytesArray = lastIPAddress.GetAddressBytes();

            Array.Reverse(firstIPAddressAsBytesArray);

            Array.Reverse(lastIPAddressAsBytesArray);

            var firstIPAddressAsInt = BitConverter.ToInt32(firstIPAddressAsBytesArray, 0);

            var lastIPAddressAsInt = BitConverter.ToInt32(lastIPAddressAsBytesArray, 0);

            var ipAddressesInTheRange = new List<IPAddress>();

            for (var i = firstIPAddressAsInt; i <= lastIPAddressAsInt; i++)
            {
                var bytes = BitConverter.GetBytes(i);

                var newIp = new IPAddress(new[] { bytes[3], bytes[2], bytes[1], bytes[0] });

                ipAddressesInTheRange.Add(newIp);
            }

            return ipAddressesInTheRange;
        }

Но уж очень он ресурсоемкий, к примеру если задать диапазон 192.168.1.1-193.168.1.1 метод отжирает порядка 1.5 гб озу. Буду благодарен за любые предложения по уменьшению потребления ОЗУ.


update

public static IEnumerable<List<string>> IPAddressesRange(IPAddress firstIPAddress, IPAddress lastIPAddress, int partCount)
        {
            var firstIPAddressAsBytesArray = firstIPAddress.GetAddressBytes();
            var lastIPAddressAsBytesArray = lastIPAddress.GetAddressBytes();

            Array.Reverse(firstIPAddressAsBytesArray);
            Array.Reverse(lastIPAddressAsBytesArray);

            var firstIPAddressAsInt = BitConverter.ToUInt32(firstIPAddressAsBytesArray, 0);
            var lastIPAddressAsInt = BitConverter.ToUInt32(lastIPAddressAsBytesArray, 0);

            var ipAddressesInTheRange = new List<string>();

            int count = 0;

            for (var i = firstIPAddressAsInt; i <= lastIPAddressAsInt; i++)
            {
                var bytes = BitConverter.GetBytes(i);
                var newIp = new IPAddress(new[] { bytes[3], bytes[2], bytes[1], bytes[0] });
                ipAddressesInTheRange.Add(newIp.MapToIPv4().ToString());
                count++;

                if (count == partCount)
                {
                    yield return ipAddressesInTheRange;
                    ipAddressesInTheRange.Clear();
                    count = 0;
                }
            }

         yield return ipAddressesInTheRange;
        }

Ответы

▲ 2Принят

Вроде там негде тратить ресурсы. Однако, ваш пример генерирует 256^3, то есть примерно 17 миллионов адресов.

Может, возвращайте не List, а IEnumerable? Через yield return. Экономия памяти 100% :)


Я имею в виду такой код:

public static IEnumerable<IPAddress> IPAddressesRange(IPAddress firstIPAddress, IPAddress lastIPAddress)
{
    var firstIPAddressAsBytesArray = firstIPAddress.GetAddressBytes();
    var lastIPAddressAsBytesArray = lastIPAddress.GetAddressBytes();

    Array.Reverse(firstIPAddressAsBytesArray);
    Array.Reverse(lastIPAddressAsBytesArray);

    var firstIPAddressAsUInt = BitConverter.ToUInt32(firstIPAddressAsBytesArray, 0);
    var lastIPAddressAsUInt = BitConverter.ToUInt32(lastIPAddressAsBytesArray, 0);

    for (var i = firstIPAddressAsUInt; i <= lastIPAddressAsUInt; i++)
    {
        var bytes = BitConverter.GetBytes(i);
        Array.Reverse(bytes);
        var newIp = new IPAddress(bytes);
        yield return newIp;
    }
}