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