代码之家  ›  专栏  ›  技术社区  ›  Neil N HLGEM

如何在小于、大于或等于之间动态切换?

c#
  •  4
  • Neil N HLGEM  · 技术社区  · 16 年前

    用户从下拉列表中选择比较类型(大于、小于、等于),然后输入要比较的大小(以字节为单位)。这就是我到目前为止所做的:

    switch (cmboCompareType.SelectedText)
    {
        case "Greater Than":
            fileOK = fi[i].Length > int.Parse(txtByteValue.Text);
            break;
        case "Less Than":
            fileOK = fi[i].Length < int.Parse(txtByteValue.Text);
            break;
        case "Equal To":
            fileOK = fi[i].Length == int.Parse(txtByteValue.Text);
            break;
    }
    

    有没有更优雅的方法来进行这种比较,而不用在C#中重复这么多代码?

    8 回复  |  直到 16 年前
        1
  •  10
  •   Brian Rasmussen    16 年前
    int value = int.Parse(txtByteValue.Text);
    int len = fi[i].Length;
    
    switch (cmboCompareType.SelectedText)
    {
        case "Greater Than": fileOK = len > value; break;
        case "Less Than": fileOK = len < value; break;
        case "Equal To": fileOK = len == value; break;
    }
    

        2
  •  18
  •   Jon Skeet    16 年前

    两种选择:

    1) 使用比较器和符号:

    int requiredSign;
    switch (cmboCompareType.SelectedText)
    {
      case "Greater Than": requiredSign = 1; break;
      case "Less Than": requiredSign = -1; break;
      case "Equal To": requiredSign = 0; break;
      default: throw new ArgumentException();
    }
    fileOK = Math.Sign(fi[i].Length.Compare(txtByteValue.Text)) == requiredSign;
    

    static readonly Func<int, int, bool> GreaterThan = (x, y) => x > y;
    static readonly Func<int, int, bool> LessThan = (x, y) => x < y;
    static readonly Func<int, int, bool> Equal = (x, y) => x == y;
    ...
    
    Func<int, int, bool> comparison;
    switch (cmboCompareType.SelectedText)
    {
      case "Greater Than": comparison = GreaterThan; break;
      case "Less Than": comparison = LessThan; break;
      case "Equal To": comparison = Equal; break;
      default: throw new ArgumentException();
    }
    fileOK = comparison(fi[i].Length, int.Parse(txtByteValue.Text));
    
        3
  •  5
  •   David    16 年前

    
    var fileOK = new Dictionary<string, Func<int, int, bool>>
        (StringComparer.OrdinalIgnoreCase)
        {
            { "Greater Than", (x, y) => x > y },
            { "Less Than", (x, y) => x < y },
            { "Equal To", (x, y) => x == y }
        }[cmboCompareType.SelectedText](fi.Length, int.Parse(txtByteValue.Text));
    
        4
  •  1
  •   John Kugelman Michael Hodel    16 年前
    int actual = Math.Sign(fi[i].Length.CompareTo(int.Parse(txtByteValue.Text)));
    int expected;
    
    switch (cmboCompareType.SelectedText)
    {
        case "Greater Than": expected = +1; break;
        case "Less Than":    expected = -1; break;
        case "Equal To":     expected =  0; break;
    }
    
    fileOK = (actual == expected);
    
        5
  •  1
  •   Reed Copsey    16 年前

    如果您有地图,您可以使用以下内容:

    private int CompareOp(string Text)
    {
        switch (cmboCompareType.SelectedText)
        {
            case "Greater Than": 
                return 1;
            case "Less Than": 
                return -1;
            case "Equal To": 
                return 0;
        }
    }
    
    // In your method:
    fileOK = (fi[i].Length.CompareTo(value) == CompareOp(cmboCompareType.SelectedText);
    
        6
  •  1
  •   Jeff Hornby    16 年前

    public static int Compare(this int a, int b, string compareType)
    {
        switch (CompareType)
        {
            case "Greater Than":
                return fi[i].Length > int.Parse(txtByteValue.Text);
                break;
            case "Less Than":
                return fi[i].Length < int.Parse(txtByteValue.Text);
                break;
            case "Equal To":
                return fi[i].Length == int.Parse(txtByteValue.Text);
                break;
        }
    }
    

    fileOK = fi[i].Length.Compare(int.Parse(txtByteValue.Text), cmboCompareType.SelectedTex);
    
        7
  •  1
  •   Jeff Hornby    16 年前

    您还可以将值-1、0、1添加到每个组合框项的value属性中,然后代码如下所示:

    fileOK = fi[i].Length.CompareTo(int.Parse(txtByteValue.Text) == cmboCompareType.SelectedValue;
    
        8
  •  0
  •   Neil N HLGEM    16 年前

    我自己的想法,受Math.Sign()解决方案的启发。由于下拉框有三个值,其索引为0,1和2,我可以减去1得到-1,0,1,然后使用该值与符号进行比较,如下所示:

    int sign = Math.Sign(fi[i].Length.CompareTo(int.Parse(txtByteValue.Text)));
    fileOK = sign == (cmboCompareType.SelectedIndex - 1);
    

    这取决于列表框中的项目是否按此特定顺序排列:
    少于


    当然,只有当这些是列表框中唯一的值时,才会起作用。也许不是最好的解决方案,但我发现我只用了两行代码就完成了这一点。

    从技术上讲,我可以将其简化为一行代码:

    fileOk=(cmboCompareType.SelectedIndex-1) == Math.Sign(fi[i].Length.CompareTo(int.Parse(txtByteValue.Text)));