using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using Newtonsoft.Json; using System.Collections; namespace Misc { /// /// int范围类, /// public class Range : INotifyPropertyChanged, Misc.ISaveToXml { #region property /// /// 开始 /// public int Begin { get; set; } = Misc.MyBase.NULL_VALUE; /// /// 结束 /// public int End { get; set; } = Misc.MyBase.NULL_VALUE; #endregion #region just get property /// /// 本范围 中心位置 /// [JsonIgnore] public int Mid { get { if (Misc.MyBase.ISVALIDATA(Begin)) return (End + Begin) / 2; else return Misc.MyBase.NULL_VALUE; } } /// /// 本范围宽度 /// [JsonIgnore] public int Width { get { if (IsValid) return End - Begin + 1; else return Misc.MyBase.NULL_VALUE; } } /// /// 是否有效 /// [JsonIgnore] public bool IsValid { get { if (Misc.MyBase.ISVALIDATA(Begin) && Misc.MyBase.ISVALIDATA(End)) return true; else return false; } } #endregion static Range() { Misc.SaveToXmlHepler.Regist(typeof(Range)); } /// /// /// /// public RangeStruct ToStruct() { return new RangeStruct(Begin, End); } public Range(RangeStruct rangeStruct) { Begin = rangeStruct.Begin; End = rangeStruct.End; } /// /// 使用无效值初始化 /// public Range() { Reset(); } #region methods /// /// 范围 r 在 本范围内 /// /// /// public bool Contain(Range r) { if ((Begin <= r.Begin) && (r.End <= End)) return true; else return false; } /// /// 点 p 在 本范围内 /// /// /// public bool Contain(int p) { if ((Begin <= p) && (p <= End)) return true; else return false; } /// /// 平移 /// /// public void Move(int offset) { Begin += offset; End += offset; } /// /// 复位为无效 /// public void Reset() { Begin = Misc.MyBase.NULL_VALUE; End = Misc.MyBase.NULL_VALUE; } /// /// 转换为8个字节 /// /// public byte[] ToBytes() { List buf = new List(); buf.AddRange(BitConverter.GetBytes(Begin)); buf.AddRange(BitConverter.GetBytes(End)); return buf.ToArray(); } /// /// 8个字节转换 /// /// /// /// public bool TryParse(byte[] value, int offset) { if (value.Length - offset < 8) return false; Begin = BitConverter.ToInt32(value, offset + 0); End = BitConverter.ToInt32(value, offset + 4); return true; } /// /// 范围并集 /// /// /// /// public static Range operator |(Range a, Range b) { return new Range() { Begin = (a.Begin < b.Begin) ? a.Begin : b.Begin, End = (a.End > b.End) ? a.End : b.End }; } /// /// 范围交集 /// /// /// /// public static Range operator &(Range a, Range b) { Range r = new Range() { Begin = (a.Begin > b.Begin) ? a.Begin : b.Begin, End = (a.End < b.End) ? a.End : b.End }; if (r.End < r.Begin) { return new Range(); } else { return r; } } /// /// 范围 a小于b /// /// /// /// public static bool operator <(Range a, Range b) { if (a.End < b.Begin)//[a.b,a.e] [b.b,b.e] { return true; } else { return false; } } /// /// 范围 a大于b /// /// /// /// public static bool operator >(Range a, Range b) { if (b.End < (a.Begin))// [b.b,b.e][a.b,a.e] { return true; } else { return false; } } public static bool operator <(int p, Range r) { if (p < r.Begin) { return true; } else { return false; } } public static bool operator >(int p, Range r) { if (p > r.End) { return true; } else { return false; } } public static bool operator <(Range r, int p) { if (r.End < p) { return true; } else { return false; } } public static bool operator >(Range r, int p) { if (r.Begin > p) { return true; } else { return false; } } /// /// 是否有交集 /// /// /// public bool HasIntersection(Range r) { if (Contain(r.Begin)) return true; if (Contain(r.End)) return true; if (r.Contain(Begin)) return true; if (r.Contain(End)) return true; return false; } /// /// 可以合并 /// /// public bool CanUnion(Range r) { if (HasIntersection(r)) return true; if (End == (r.Begin - 1)) return true; if (Begin == (r.End + 1)) return true; return false; } /// /// 复制 r 的值到 本范围内 /// /// public void Copy(Range r) { Begin = r.Begin; End = r.End; } /// /// 克隆 /// /// public Range Clone() { Range r = new Range(); r.Copy(this); return r; } #endregion /// /// /// /// public override string ToString() { return "[" + Begin.ToString() + "," + End.ToString() + "]=" + Width.ToString(); } #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; #endregion #region ISaveToXml 成员 public string[] GetSavePropertyNames() { return new string[]{ "Begin","End" }; } #endregion } /// /// Range 比较器 /// public class RangeEqualityComparer : IEqualityComparer { /// /// /// /// /// /// public bool Equals(Range x, Range y) { if (x == y) return true; else if (x == null || y == null) return false; if ((x.Begin == y.Begin) && (x.End == y.End)) { return true; } else return false; } /// /// /// /// /// public int GetHashCode(Range obj) { int hashCode = obj.Begin.GetHashCode(); int hashCode2 = obj.End.GetHashCode(); if (hashCode != hashCode2) { hashCode ^= hashCode2; } return hashCode; } } /// /// Range 辅助类 /// public static class EListRange { /// /// rlist 必须是由小到大排列 /// /// /// public static void Union(this List rlist, Range r) { for (int i = 0; i < rlist.Count(); i++) { Range r_dest = rlist[i]; if (r < r_dest)//在 r_dest 前面 { rlist.Insert(i, r); return;//完成 } else if (r.CanUnion(r_dest)) //r 与 r_dest 有交集 { //r 与 r_dest 合体 r = r | r_dest; rlist.RemoveAt(i); i--; //还需要继续判断 } } //r 在 rlist 的后面 rlist.Add(r); } /// /// 联合 /// /// /// public static void Union(this List rlist1, List rlist2) { for (int i = 0; i < rlist2.Count(); i++) { rlist1.Union(rlist2[i]); } } } }