C#in运算符重载
我昨晚写if表达式的时候有个主意 有时,当你有这样的表达时,它往往很长:C#in运算符重载,c#,linq,operator-overloading,synonym,C#,Linq,Operator Overloading,Synonym,我昨晚写if表达式的时候有个主意 有时,当你有这样的表达时,它往往很长: if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... } if(x.In(1,6,9,11)) { // do something.... } x可以是枚举、字符串、整数、字符,您可以看到图片 我想知道是否有更简单的方法来写这个。 例如,我认为sql的运算符“in”可以缩短表达式: if(x in (1,2,33,4,-5
if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... }
if(x.In(1,6,9,11))
{
// do something....
}
x可以是枚举、字符串、整数、字符,您可以看到图片
我想知道是否有更简单的方法来写这个。
例如,我认为sql的运算符“in”可以缩短表达式:
if(x in (1,2,33,4,-5,61)) { ... }
我知道不能用“in”编写这样的表达式,因为编译器的lexer和解析器不会识别它
也许其他解决方案作为不同类型x的扩展方法就是解决方案?
在即将到来的.NET4.0中,我听说了一些关于参数化方法的事情,这是否应该解决提供给if表达式的n个参数量
也许你理解我的意思,你对这个问题有什么好的做法/解决方案吗
/丹尼尔试试下面的方法
if ( (new []{1,2,33,4,-5,61}).Any(i => x == i) ) {
...
}
bool-In(T-num,参数int-args)
{
返回(新列表(args)).Contains(num);
}
公共静态布尔输入(此T X,参数T[]列表)
{
foreach(列表中的变量项)
{
如果(X等于(项目))
返回true;
}
返回false;
}
如果x是一个int,您可以编写如下扩展方法:
public static bool In(this int i, params int[] values){
foreach(int v in values) {
if (i == v) {
return true;
}
}
return false;
}
我通常写一篇文章如下:
public static bool In<T>(this T source, params T[] list)
{
if(null==source) throw new ArgumentNullException("source");
return list.Contains(source);
}
我想你想要的是int而不是string。我想这个问题是针对所有类型的。通过类型推断,你甚至可以跳过
int
(我想)。@Svish没有意识到这是可能的,但验证了它与2010 Beta2一起工作。更新后的回答我将使用new[]{1,2,33,4,-5,61})。Contains(x)
,Contains通常用于确定序列是否包含元素,因此在表达意图时更明确,Any()更通用,甚至可以通过使用简单的等式检查使其看起来像包含。我认为扩展方法路由是更好的设计。在您的解决方案中,每次使用In函数时都会复制它的逻辑。使用扩展方法,算法是集中的,如果需要,可以全局更改,而且在使用点上看起来更干净。这很难看。扩展方法的方法更清晰、更容易阅读代码>?数组没有Contains methodArray implementsIEnumerable
,它在系统中有一个Contains扩展方法。LinqI发现标题有点混淆。看起来你想在操作符重载中使用C。我把这些放在大写字母里是因为我没有更好的办法来说明这一点。为什么要有一个泛型方法,它只需要一个int列表?考虑使用PARAMS[]ARGS来代替,然后调用它。直接包含。我喜欢这个,因为它是通用的,使用了包含方法,而不是= =操作符。感觉自然多了。我还添加了一个重载:publicstaticbool-In(这个T源代码,IEnumerable列表)和同一个主体。
public static bool In(this int i, params int[] values){
foreach(int v in values) {
if (i == v) {
return true;
}
}
return false;
}
public static bool In<T>(this T source, params T[] list)
{
if(null==source) throw new ArgumentNullException("source");
return list.Contains(source);
}
if(x.In(1,6,9,11))
{
// do something....
}