Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-在一行代码中比较一个值和多个值的更漂亮的方法_C#_Comparison_Equality_Conditional Operator_Readability - Fatal编程技术网

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

C#-在一行代码中比较一个值和多个值的更漂亮的方法,c#,comparison,equality,conditional-operator,readability,C#,Comparison,Equality,Conditional Operator,Readability,我有一段代码: if (filter != RECENT && filter != TODAY && filter != WEEK && filter != MONTH && filter != ALLTIME) { filter = RECENT; } 请注意,filter是一个string,它与const string类型进行比较。是否有任何方法可以内联执行此操作并使其更具可读性?使用三

我有一段代码:

if (filter != RECENT &&
    filter != TODAY &&
    filter != WEEK &&
    filter != MONTH &&
    filter != ALLTIME)
{
    filter = RECENT;
}
请注意,
filter
是一个
string
,它与
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;
有没有更好的方法(prettier==所有逻辑必须在一行代码中)来进行比较?更具体地说是为了防止
filter!=XXXXX
重复

请注意,性能不是我主要关心的问题。

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

使用哈希集 区分大小写的比较:

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;
}
不区分大小写的比较:

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
语句,但这会降低代码的可读性。另外,从调试的角度来看,在
if
语句中设置断点以检查数组是否包含筛选器比使用操作符
?:
设置断点更容易:


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

  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";
  }

取决于过滤器实际上是什么。它是枚举吗?如果是这样的话,它是一个带有
[Flags]
属性的枚举吗?@elgonzo
filter
只是一个
字符串。它与常量进行比较,例如
conststringrecent=“RECENT”。您可以将这些字符串放入数组中,然后使用Linq。如果您随后使用
params string[].
参数(
params string[].
参数就是我提到的字符串数组)进一步创建/使用一个静态方法,或者更好地使用一个扩展方法,那么您可以将测试简化为类似于
filter.IsNot(filter.RECENT,filter.TODAY,…)
创建一个常量数组,然后
!包含(筛选器)< /代码>或考虑使用EnUM作为elgZZO建议。我们不知道您的应用程序,但据我们所知,这可能比比较字符串更好;数组类型(如Contains)提供的函数可能就是您所需要的全部功能…这种方法的缺点是每次调用时都会创建一个数组。此外,
foreach
可以替换为
Contains