C#-在一行代码中将一个值与多个值进行比较的更漂亮方法

时间:2018-10-27 10:23:21

标签: c# comparison equality conditional-operator readability

我有这段代码:

if (filter != RECENT &&
    filter != TODAY &&
    filter != WEEK &&
    filter != MONTH &&
    filter != ALLTIME)
{
    filter = RECENT;
}

请注意,filterstring,并与const string类型进行了比较。有什么方法可以内联进行,并使它更具可读性吗?使用三元运算符并不能使它变得更好,因为我仍然必须重复filter != XXXXX

filter = filter != RECENT &&
         filter != TODAY &&
         filter != WEEK &&
         filter != MONTH &&
         filter != ALLTIME ? RECENT : filter;

这显然不起作用

filter = filter != RECENT && TODAY && WEEK && MONTH && ALLTIME ? RECENT : filter;

是否有任何更漂亮的方式(更漂亮的==所有逻辑都必须在一行代码中)进行此比较?更具体地说,是防止filter != XXXXX重复。

请注意,性能并不是我对这个问题的主要关注。

2 个答案:

答案 0 :(得分:1)

我更喜欢创建一个扩展方法。

  public static bool NotIn(this string filter , params string[] valuesToCompare)
    {
        var result = true;
        foreach (var item in valuesToCompare)
        {
            if (filter == item) return false;
        }
        return result;
    }

并使用类似

if( filter.NotIn("RECENT", "TODAY ", "WEEK ", "MONTH", "ALLTIME"))
  {
     filter = "RECENT";
  }

答案 1 :(得分:0)

请注意,此答案是在OP澄清他们只需要单行解决方案之前写的。

使用HashSet

区分大小写的比较:

var filters = new HashSet<string>(new[] { RECENT, TODAY, WEEK, MONTH, ALLTIME });

if (!filters.Contains(filter))
{
    filter = RECENT;
}

不区分大小写的比较:

var filters = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
filters.UnionWith(new[] { RECENT, TODAY, WEEK, MONTH, ALLTIME });

if (!filters.Contains(filter))
{
    filter = RECENT;
}

使用字符串数组

区分大小写的比较:

string[] filters = {RECENT, TODAY, WEEK, MONTH, ALLTIME};

if (!filters.Contains(filter))
{
    filter = RECENT;
}

不区分大小写的比较:

string[] filters = {RECENT, TODAY, WEEK, MONTH, ALLTIME};

if (!filters.Contains(filter, StringComparer.OrdinalIgnoreCase))
{
    filter = RECENT;
}

编辑

可以使用三元运算符?:代替if语句,但是IMO会降低代码的可读性。另外,从调试的角度来看,与使用运算符if设置断点相反,在?:语句内设置断点来检查数组是否包含过滤器更容易:

Breakpoints