Генерация ip из диапазонов. Менее ресурсоемкая
Доброго времени суток. Встал вопрос о генерации 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;
}
Источник: Stack Overflow на русском