c# - 多部分字母数字字符串的比较

标签 c# string comparison

我收到一个字符串,其中包含当前在系统中运行的 sw 版本。

我只想在系统运行在某个软件版本或 稍后。

例如如果系统正在运行 sw 版本 2.D 或更高版本 (2.E, ..) 我会做一些操作。如果系统运行的是较低的 sw 版本(2.C, ..),那么我不会这样做。

如何对字符串进行这种比较?

最佳答案

有很多方法可以做到这一点,但是如果您知道字符串的形式是 x.y 甚至 x.y.z... 那么我会建议使用自定义 StringComparer:

using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace StingComparisons
{
[TestClass]
public class StringComparison
{
    [TestMethod]
    public void TestMethod1()
    {
        var a = "2.E";
        var b = "2.F";
        var c = "2.C";
        var d = "1.F";
        var e = "3.A";

        StringComparer comp = new MyStringComparer();

        Assert.IsTrue(b.IsSameOrAfter(a, comp));
        Assert.IsFalse(c.IsSameOrAfter(a, comp));
        Assert.IsFalse(d.IsSameOrAfter(a, comp));
        Assert.IsTrue(e.IsSameOrAfter(a, comp));
        Assert.IsTrue(a.IsSameOrAfter(a, comp));
    }

    [TestMethod]
    public void TestMethod2()
    {
        var a = "2.E.1";
        var b = "2.E";
        var c = "2.E.2";
        var d = "2.F";
        var e = "2.D.3";
        var f = "3.A";

        StringComparer comp = new MyStringComparer();

        Assert.IsFalse(b.DotDelimitedIsSameOrAfter(a));
        Assert.IsTrue(c.DotDelimitedIsSameOrAfter(a));
        Assert.IsTrue(d.DotDelimitedIsSameOrAfter(a));
        Assert.IsFalse(e.DotDelimitedIsSameOrAfter(a));
        Assert.IsTrue(f.DotDelimitedIsSameOrAfter(a));
        Assert.IsTrue(a.DotDelimitedIsSameOrAfter(a));
    }
}

public static class stringExtensions
{
            public static bool DotDelimitedIsSameOrAfter(this string a, string b)
            {
                   return a.IsSameOrAfter(b, new MyStringComparer());
            }

    public static bool IsSameOrAfter(this string a, string b, StringComparer comp)
    {
        return comp.Compare(a, b) <= 0;
    }
}

public class MyStringComparer : StringComparer
{

    public override int Compare(string x, string y)
    {
        var partsX = x.Split('.');
        var partsY = y.Split('.');
        for (int i = 0; i < partsY.Length; i++)
        {
            if (partsX.Length <= i)
                return 1;
            var partComp = partsY[i].CompareTo(partsX[i]);
            if (partComp != 0)
                return partComp;
        }
        return 0;
    }

    public override bool Equals(string x, string y)
    {
        return x.Equals(y);
    }

    public override int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}
}

我将调用包装在扩展方法中纯粹是为了使其更具可读性。

关于c# - 多部分字母数字字符串的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658698/

相关文章:

c++异常从字符串转换为c_str创建垃圾字符

c++ - 查找其字符可能有多个变体的字符串的所有可能版本

image - Protractor:如何使用 Protractor 图像比较来比较全页屏幕截图

javascript - 你如何比较 JS 中的 "week-year"值?

c# - 从两个单独的变量 C# 创建 double 值

c# - 如何使用 linq 通过entity.ids 查找匹配实体的最大日期

c# - 新的 MVC Area _layout 不继承....System.Web.WebPages.StartPage

c# - 从 Process 对象获取 Process 的 "Command Line"和参数?

java - 检查输入字符串是否具有特定模式

pointers - 我如何比较 Go 中的指针?