如何在比较小于,大于或等于?之间动态切换?

Nei*_*l N 4 c#

基本上我给用户一个选项来根据他们的大小过滤一组文件.

用户从下拉列表中选择比较类型(大于,小于,等于),然后输入大小(以字节为单位)进行比较.这是我到目前为止:

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;
}
Run Code Online (Sandbox Code Playgroud)

是否有一种更优雅的方式来进行这种比较,而无需在C#中重复这么多代码?

Jon*_*eet 18

两种选择:

1)使用CompareTo和Sign:

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;
Run Code Online (Sandbox Code Playgroud)

2)使用代表:

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));
Run Code Online (Sandbox Code Playgroud)

  • 虽然我总是喜欢约翰双向飞碟的思维扩展答案,但我认为这两种解决方案在这种情况下都是过度的.这是一个艰难的电话,但我想我会接受更简单的答案. (2认同)

jri*_*sta 10

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;
}
Run Code Online (Sandbox Code Playgroud)

TADA!减少重复.,P


Dav*_*ave 5

我不是案例陈述的粉丝,但同样的事情,只是另一种方式.


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));
Run Code Online (Sandbox Code Playgroud)