C#在运算符重载中

时间:2009-11-04 09:09:22

标签: c# linq operator-overloading synonym

在写一个if-expression时我刚才有了一个想法 当你有这样的表达时,表达式往往很长:

if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... }

x可以是枚举,字符串,整数,字符,你可以得到图片。

我想知道是否有更简单的方式来写这个。 我认为sql的运算符'in'例如可以缩短表达式:

if(x in (1,2,33,4,-5,61)) { ... }

我知道你不能用'in'写这样的表达式,因为编译器的词法分析器和解析器不能识别它。

也许其他解决方案作为不同类型x的扩展方法是解决方案? 在即将推出的.NET 4.0中,我听说过参数化方法,应该解决提供给if-expression的n个参数吗?

也许你理解我,你对这个问题有一个好的实践/解决方案吗?

/丹尼尔

6 个答案:

答案 0 :(得分:18)

我通常写一个Extension Method如下:

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....
}

答案 1 :(得分:13)

尝试以下

if ( (new []{1,2,33,4,-5,61}).Any(i => x == i) ) {
  ...
}

答案 2 :(得分:1)

    public static bool In<T>(this T X, params T[] list)
    {
        foreach (var item in list)
        {
            if (X.Equals(item))
                return true;
        }
        return false;
    }

答案 3 :(得分:0)

   string[] possible = new string[3] { 1, 2, 3);

   if (possible.Contains(x)) { ...

答案 4 :(得分:0)

    bool In<T>(T num, params int args)
    {
        return (new List<T>(args)).Contains(num);
    }

答案 5 :(得分:0)

假设x是一个int,你可以写一个像这样的扩展方法:

public static bool In(this int i, params int[] values){
    foreach(int v in values) {
        if (i == v) {
            return true;
        }
    }
    return false;
}