运算符重载 简单样例: 版本大小比较
2009-08-05 13:34
447 查看
namespace Test { using System; using Microshaoft; public class Class1 { static void Main(string[] args) { Console.WriteLine("第一个\".\"和第二个\".\"之间的数字按小数比较,其他按整数比较"); StringVersion v1 = new StringVersion("12.0390.001"); StringVersion v2 = new StringVersion("21.039000.1"); Console.WriteLine("版本: [{0}][{1}] ", v1.ToString(), v2.ToString()); Console.WriteLine("GetHashCode: [{0}][{1}] ", v1.GetHashCode(), v2.GetHashCode()); Console.WriteLine("Equals , {0} ", v1.Equals(v2)); Console.WriteLine("== , {0} ", v1 == v2); Console.WriteLine("!= , {0} ", v1 != v2); Console.WriteLine("> , {0} ", v1 > v2); Console.WriteLine("< , {0} ", v1 < v2); Console.WriteLine(">= , {0} ", v1 >= v2); Console.WriteLine("<= , {0} ", v1 <= v2); Console.WriteLine(Environment.Version.ToString()); } } } namespace Microshaoft { using System; public class StringVersion { private string[] _versions; private string _version; protected string[] Versions { get { return _versions; } } public StringVersion(string version) { _version = version; char[] c = new char[]{'.'}; _versions = version.Split(c); } public override string ToString() { return _version; } public override bool Equals(object o) { StringVersion x = this; StringVersion y = o as StringVersion; int xl = x.Versions.Length; int yl = y.Versions.Length; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd != yd) { return false; } } else { if (xi != yi) { return false; } } } return true; } public override int GetHashCode() { string[] a = new string[_versions.Length]; Array.Copy(_versions, 0, a, 0, a.Length); for(int i = 0; i < _versions.Length; i ++) { if (i == 1) { a[i] = _versions[i].TrimEnd('0'); } else { a[i] = _versions[i].TrimStart('0'); } } string s = string.Join(".", a); return s.GetHashCode(); } public static bool operator == (StringVersion x, StringVersion y) { return x.Equals(y); } public static bool operator != (StringVersion x, StringVersion y) { int xl = x.Versions.Length; int yl = y.Versions.Length; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd != yd) { return true; } } else { if (xi != yi) { return true; } } } return false; } public static bool operator > (StringVersion x, StringVersion y) { int xl = x.Versions.Length; int yl = y.Versions.Length; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd > yd) { return true; } else if (xd < yd) { return false; } } else { if (xi > yi) { return true; } else if (xi < yi) { return false; } } } return false; } public static bool operator < (StringVersion x, StringVersion y) { int xl = x.Versions.Length; int yl = y.Versions.Length; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd < yd) { return true; } else if (xd > yd) { return false; } } else { if (xi < yi) { return true; } else if (xi > yi) { return false; } } } return false; } public static bool operator >= (StringVersion x, StringVersion y) { int xl = x.Versions.Length; int yl = y.Versions.Length; bool equal = true; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd > yd) { return true; } else if (xd < yd) { return false; } equal = equal && (xd == yd); } else { if (xi > yi) { return true; } else if (xi < yi) { return false; } equal = equal && (xi == yi); } } return equal; } public static bool operator <= (StringVersion x, StringVersion y) { int xl = x.Versions.Length; int yl = y.Versions.Length; bool equal = true; for (int i = 0; i < xl || i < yl; i ++) { uint xi = 0; uint yi = 0; double xd = 0.0d; double yd = 0.0d; if (i < xl) { if (i != 1) { uint.TryParse(x.Versions[i], out xi); } else { double.TryParse ( string.Format("0.{0}", x.Versions[i]) , out xd ); } } if (i < yl) { if (i != 1) { uint.TryParse(y.Versions[i], out yi); } else { double.TryParse ( string.Format("0.{0}", y.Versions[i]) , out yd ); } } if (i == 1) { if (xd < yd) { return true; } else if (xd > yd) { return false; } equal = equal && (xd == yd); } else { if (xi < yi) { return true; } else if (xi > yi) { return false; } equal = equal && (xi == yi); } } return equal; } } }
相关文章推荐
- 比之前那个版本更简单的C语言实现的比较大小
- 比之前那个版本更简单的C语言实现的比较大小
- 简单比较版本名称大小,如1.8.1,2.10.0等
- Sybase(sqlanywhere)比较应用版本大小数据库存储过程
- java通过Comparable接口实现字符串比较大小排序的简单实例
- Swift3 获取版本号,比较版本大小
- 简单的比较两数大小
- javascript简单比较日期大小的方法
- 简单的js比较时间的大小
- JavaScript 时间简单比较大小
- 时间操作(JavaScript版)—最简单比较两个时间格式数据的大小
- CodeForces 602A Two Bases(简单题,比较两个不同进制数的大小)——Codeforces Beta Round #333 (Div. 2)
- 一个简单的数据类型判断:占用不同大小字节的变量比较
- 一个比较简单的每日更新cdn版本的后缀编码方式
- android应用版本的大小比较
- 客户端版本比较大小比较类
- java中的简单的字符串大小比较方法——compareto方法的详细介绍
- leetcode_165. Compare Version Numbers 比较版本大小
- UVA 12709 Falling Ants(简单的比较大小)
- JS比较两个时间大小的简单示例代码