una versión con 5 partes? Si estaba usando la versión típica de 4 partes, podría usar la clase System.Version, que incluye métodos para comparar versiones y analizar la cadena de versión
psousa
1
¿Cuáles son los tipos de x e y?
Gleno
55
Cada vez que alguien dice "No usar X, Yo Z", siempre me hace preguntarme por qué. ¿Por qué no quieres usar la splitfunción? La splitfunción parece una buena manera de hacer esto si no vas a usar la System.Versionclase.
Tiene una interfaz IComparable. Tenga en cuenta que esto no funcionará con una cadena de versión de 5 partes como la que ha mostrado (¿es realmente su cadena de versión?). Suponiendo que sus entradas son cadenas, aquí hay una muestra de trabajo con la cadena de versión normal .NET de 4 partes:
staticclassProgram{staticvoidMain(){string v1 ="1.23.56.1487";string v2 ="1.24.55.487";var version1 =newVersion(v1);var version2 =newVersion(v2);var result = version1.CompareTo(version2);if(result >0)Console.WriteLine("version1 is greater");elseif(result <0)Console.WriteLine("version2 is greater");elseConsole.WriteLine("versions are equal");return;}}
@dev_Boston solo una excepción ... solo hazlo con estos valores v1 = 1.0001 y v2 = 1.1. me da igual.
Sankar M
8
Sí, las cadenas de versión no son cadenas decimales, y los ceros anteriores a una parte del número de versión son irrelevantes. En otras palabras, "00001" es igual a "1" en la segunda parte de la cadena de versión.
JohnD
8
Puede comparar más legible como Version.Parse(v1) < Version.Parse(v2), porque operator >(Version v1, Version v2)está implementado.
Andrey Moiseev
Tenga en cuenta que Version.Parse ("6.0.0") es menor que (<) Version.Parse ("6.0.0.0") (es decir, NO son iguales). Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
adospace
13
Si puede vivir con el esquema major.minor.build.revision, podría usar la clase .Net Version . De lo contrario, tendría que implementar algún tipo de análisis de izquierda a derecha y continuar hasta que tenga una diferencia o regrese que dos versiones son iguales.
Además de la respuesta de @JohnD, podría ser necesario comparar solo números de versión parciales sin usar Split ('.') U otra cadena <-> int bloat de conversión. Acabo de escribir un método de extensión CompareTo con 1 argumento adicional: número de partes significativas del número de versión para comparar (entre 1 y 4).
Tenga en cuenta que esto sería igual paracompareVersion("1.3", "1.3.1")
Ozgur Ozcitak
1
Si por alguna razón no se le permite usar el método de comparación de la Versión directamente (por ejemplo, en un escenario cliente-servidor), otro enfoque es extraer un número largo de la versión y luego comparar los números entre sí. Sin embargo, el número debe tener el siguiente formato: dos dígitos para mayor, menor y revisión y cuatro para compilación.
Cómo extraer el número de versión:
var version =Assembly.GetExecutingAssembly().GetName().Version;long newVersion = version.Major*1000000000L+
version.Minor*1000000L+
version.Build*1000L+
version.Revision;
Y luego, en otro lugar, puedes comparar:
if(newVersion > installedVersion){//update code}
Nota: la versión instalada es un número largo previamente extraído
Para dar a todos los dígitos 3 lugares, el código debería ser: "version.Major * 1000000000L + version.Minor * 1000000L + version.Build * 1000L + version.Revision"
Stef Heyenrath
1
@StefHeyenrath Eso es correcto, no dude en ajustar el código anterior a sus propias necesidades.
X
,Y
oZ
", siempre me hace preguntarme por qué. ¿Por qué no quieres usar lasplit
función? Lasplit
función parece una buena manera de hacer esto si no vas a usar laSystem.Version
clase.Respuestas:
¿Puedes usar la clase Version?
http://msdn.microsoft.com/en-us/library/system.version.aspx
Tiene una interfaz IComparable. Tenga en cuenta que esto no funcionará con una cadena de versión de 5 partes como la que ha mostrado (¿es realmente su cadena de versión?). Suponiendo que sus entradas son cadenas, aquí hay una muestra de trabajo con la cadena de versión normal .NET de 4 partes:
fuente
Version.Parse(v1) < Version.Parse(v2)
, porqueoperator >(Version v1, Version v2)
está implementado.Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
Si puede vivir con el esquema major.minor.build.revision, podría usar la clase .Net Version . De lo contrario, tendría que implementar algún tipo de análisis de izquierda a derecha y continuar hasta que tenga una diferencia o regrese que dos versiones son iguales.
fuente
Además de la respuesta de @JohnD, podría ser necesario comparar solo números de versión parciales sin usar Split ('.') U otra cadena <-> int bloat de conversión. Acabo de escribir un método de extensión CompareTo con 1 argumento adicional: número de partes significativas del número de versión para comparar (entre 1 y 4).
fuente
fuente
compareVersion("1.3", "1.3.1")
Si por alguna razón no se le permite usar el método de comparación de la Versión directamente (por ejemplo, en un escenario cliente-servidor), otro enfoque es extraer un número largo de la versión y luego comparar los números entre sí. Sin embargo, el número debe tener el siguiente formato: dos dígitos para mayor, menor y revisión y cuatro para compilación.
Cómo extraer el número de versión:
Y luego, en otro lugar, puedes comparar:
Nota: la versión instalada es un número largo previamente extraído
fuente