我有这段代码:
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;
是否有任何更漂亮的方式(更漂亮的==所有逻辑都必须在一行代码中)进行此比较?更具体地说,是防止filter != XXXXX
重复。
请注意,性能并不是我对这个问题的主要关注。
答案 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澄清他们只需要单行解决方案之前写的。
区分大小写的比较:
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
设置断点相反,在?:
语句内设置断点来检查数组是否包含过滤器更容易: