/// <summary> /// Определение адресов, принадлежащих сразу двум диапазонам /// </summary> /// <param name="range">Заданный диапазон адресов</param> /// <returns>Массив диапазонов, включающих адреса, принадлежащие только одному из диапазонов</returns> internal IPRange[] Exclude(IPRange range) { IPRange[] result = new IPRange[0]; //Верхняя граница заданного диапазона попадает в данный диапазон if (this.Contains(range.UpperBound) && range.Contains(this.LowerBound)) { Array.Resize <IPRange>(ref result, 2); result[0] = new IPRange(range.LowerBound, this.LowerBound); result[1] = new IPRange(range.UpperBound, this.UpperBound); return(result); } //Нижняя граница заданного диапазона попадает в данный диапазон if (this.Contains(range.LowerBound) && range.Contains(this.UpperBound)) { Array.Resize <IPRange>(ref result, 2); result[0] = new IPRange(this.LowerBound, range.LowerBound); result[1] = new IPRange(this.UpperBound, range.UpperBound); return(result); } //Весь заданный диапазон попадает внутрь данного диапазона if (this.Contains(range.UpperBound) && this.Contains(range.LowerBound)) { Array.Resize <IPRange>(ref result, 2); result[0] = new IPRange(this.LowerBound, range.LowerBound); result[1] = new IPRange(range.UpperBound, this.UpperBound); return(result); } //Весь данный диапазон попадает внутрь заданного диапазона if (range.Contains(this.UpperBound) && range.Contains(this.LowerBound)) { Array.Resize <IPRange>(ref result, 2); result[0] = new IPRange(range.LowerBound, this.LowerBound); result[1] = new IPRange(this.UpperBound, range.UpperBound); return(result); } return(result); }
static void Main(string[] args) { string[] orig = File.ReadAllLines(@"..\..\original.txt", Encoding.Default); string[] subtract = File.ReadAllLines(@"..\..\subtract.txt", Encoding.Default); StreamWriter sw = new StreamWriter(@"..\..\result.txt"); IPRange ipOrig, ipSub; bool excluded; foreach (string origItem in orig) { ipOrig = IPRange.Parse(origItem); excluded = false; foreach (string subtractItem in subtract) { ipSub = IPRange.Parse(subtractItem); IPRange[] res = ipOrig.Exclude(ipSub); if (res.Length > 0) { sw.WriteLine(res[0].ToString()); sw.WriteLine(res[1].ToString()); Console.WriteLine(res[0].ToString()); Console.WriteLine(res[1].ToString()); excluded = true; } } if (!excluded) { sw.WriteLine(ipOrig.ToString()); Console.WriteLine(ipOrig.ToString()); } } sw.Close(); Console.Read(); }