C#中的运算符重载

7

昨晚我在写if语句时有了一个想法,当你像这样写代码时,有时表达式会变得很长:

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表达式中提供的n个参数的问题?

也许你理解我的意思,你有没有好的实践/解决方案来回答这个问题呢?

/Daniel


我觉得标题有点令人困惑。似乎你想在运算符重载中使用C#。我将IN大写是因为没有更好的想法来使其更清晰。 - Boris Callens
6个回答

18

我通常按照以下方式编写扩展方法

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
我喜欢这个,因为它是通用的,并且使用了Contains方法而不是==运算符。 - Boris Callens
我无法用双手赞美这个足够... 它感觉更自然。我还添加了一个重载: public static bool In<T>(this T source, IEnumerable<T> list) 其主体相同。 - Chris Pfohl

13

尝试以下代码

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

3
有了类型推断,甚至可以省略 int(我想)。 - Svish
@Svish,我之前没意识到这是可能的,但我验证过了,在2010 Beta2中确实可行。已更新答案。 - JaredPar
7
我会使用new[] {1, 2, 33, 4, -5, 61}.Contains(x),Contains通常用于确定序列是否包含一个元素,因此在表达意图时更加明确。Any()则更为通用,即使您可以通过简单的相等性检查使其像Contains一样工作。 - Pop Catalin
1
我认为扩展方法路由是更好的设计。在你的解决方案中,每次使用它时都会重复 In 函数的逻辑。使用扩展方法,算法被集中,并且可以全局更改,如果需要的话 - 而且在使用时看起来更加简洁。 - Winston Smith
那看起来相当丑陋。扩展方法的方式更清晰易读。 - Ash

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

return list.Contains(x); 怎么样? - Pop Catalin
数组没有包含方法。 - Alex Reitbort
数组实现了 IEnumerable<T> 接口,在 System.Linq 中有一个 Contains 扩展方法。 - Lee

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

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

我认为你想要的是 int 而不是 string。 - JaredPar
我认为这个问题是针对所有类型的。 - Boris Callens

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

1
为什么要使用一个只接受整数列表的通用方法?考虑改用params T[] args - 然后您可以直接调用.Contains。 - Winston Smith

0

假设 x 是一个整数,你可以编写一个扩展方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接