Python中的'in'运算符相当于C#中的什么?

14

在Python中,我可以使用“in”运算符进行集合操作,如下所示:

x = ['a','b','c']
if 'a' in x:
  do something

在C#中等价的是什么?


我不记得确切的语法,但我敢打赌你可以用LINQ实现。 - FrustratedWithFormsDesigner
那不是一个集合操作,因为那是一个列表而不是一个集合。 - David Heffernan
2个回答

26

大多数集合声明了一个Contains方法(例如通过ICollection<T>接口),但更通用的LINQ Enumerable.Contains方法也是可用的:

char[] x = { 'a', 'b', 'c' };

if(x.Contains('a'))
{
   ...    
}

如果你认为这样做是“反其道而行之”,那么你可以编写一个扩展程序来纠正这个问题:

public static bool In<T>(this T item, IEnumerable<T> sequence)
{
   if(sequence == null)
      throw new ArgumentNullException("sequence");

   return sequence.Contains(item);    
}

并将其用作:

char[] x = { 'a', 'b', 'c' };

if('a'.In(x))
{
   ...    
}

2
如果 x 是一个字典,则使用 ContainsKey - Gabe
2
@David Heffernan:这是一个选项,但在.NET中,容器类型的null引用通常用于表示容器本身的不存在而不是容器。如果我们假设这个约定;第二个参数为null确实是一个错误。 - Ani
@Ani 好的,我对 .net 的惯例了解不多。如果“sequence == null”不是有效输入,为什么不让代码继续执行到 sequence.Contains 呢? - David Heffernan
1
@David:Python的in运算符对于None序列会抛出异常,因此这是预期行为。 - Gabe
我同意@JBSnorro的观点。我不喜欢这个In<T>方法的阅读方式,感觉有些奇怪。 - user47589
显示剩余5条评论

2

Ani 的回答基础上,Python 中字典使用的 in 运算符相当于 C# 中的 ContainsKey 方法,因此您需要两个扩展方法:

public static bool In<T, V>(this T item, IDictionary<T, V> sequence)
{
    if (sequence == null) throw new ArgumentNullException("sequence");
    return sequence.ContainsKey(item);
}

public static bool In<T>(this T item, IEnumerable<T> sequence)
{
    if (sequence == null) throw new ArgumentNullException("sequence");
    return sequence.Contains(item);
}

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