Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#in运算符重载_C#_Linq_Operator Overloading_Synonym - Fatal编程技术网

C#in运算符重载

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表达式的时候有个主意 有时,当你有这样的表达时,它往往很长:

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 implements
IEnumerable
,它在系统中有一个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....
}