2

我有一个字符串数组,我想知道该数组是否不包含某个字符串。我可以将 not 运算符 (!) 与 Contains 方法结合使用,如下所示:

if (!stringArray.Contains(searchString))
{
    //do something
}

扫描代码时可能会忽略非运算符(!),所以我想知道创建扩展方法以提高可读性是否被认为是不好的做法:

public static bool DoesNotContain<T>(this IEnumerable<T> source, T value)
{
    return !source.Contains<T>(value);
}

所以现在代码可以读取:

if (stringArray.DoesNotContain(searchString))
{
    //do something
}

这种事情是不是很不服气?

4

12 回答 12

4

就个人而言,我不会为如此简单的事情制作扩展方法。我了解您正在尝试保持它的可读性,但大多数 C# 开发人员应该抓住 ! 操作员。它被大量使用,即使是初学者通常也能认出它。

于 2010-12-01T16:46:08.210 回答
4

保持 !。这是行上方的注释有助于提高可读性的地方。
(我怀疑!更有效)

//If the word is NOT in the array then...

另一点是您是否对使用数组一无所知?有一些东西(你可能知道也可能不知道)叫做HashSet.

如果您的唯一目的是检查字符串是否在列表中,那么您实际上是在查看集合算术。

除非您将数组用于查找某个术语是否在其中以外的其他用途,否则请尝试使用HashSet... 快得多。

于 2010-12-01T16:51:15.713 回答
3

似乎没有必要,!source.Contains<T>(value);可读性很好。此外,使用现有Contains函数意味着您的代码将更具可移植性(即,它不会依赖于您的扩展方法是否存在)。

于 2010-12-01T16:47:04.477 回答
3

我肯定会使用!stringArray.Contains(string). 这是 99.9% 的所有开发人员使用的。DoesNotContain至少会让我感到困惑。

于 2010-12-01T16:49:57.110 回答
3

我认为你的问题是基于一个错误的前提。即开发人员将阅读!您的代码中的内容。!布尔运算符在大量流行的编程语言(C、C++、C#、Java 等)中是一个众所周知的运算符。!任何可能会定期 阅读过去的人可能不应该在没有事先进行大量审查的情况下签入代码。

感觉就像你在说以下

我希望人们用 C# 编写代码,但我不相信他们会阅读它,因此我将使用扩展方法在我的代码库中创建一个新的方言。

为什么要停止!运营商?他们似乎很可能会错过+in+=表达式或将 a 读|为 a ||

于 2010-12-01T16:53:59.273 回答
2

从未见过 .NET 框架中的 DoesNot* 方法,所以我认为您的问题与 ! 被高估了。

于 2010-12-01T16:47:04.080 回答
2

我想这是个人的选择,而不是好/坏的做法。IMO 我喜欢扩展方法,因为它更具声明性,因此更具可读性,乍一看您确切地知道它的作用。只是我的 2 美分

于 2010-12-01T16:47:54.530 回答
2

这听起来是个坏主意,现在您的代码的使用者必须知道两种方法(DoesNotContainContains),而不仅仅是一个。一般来说,我会避免使用 XXNotXX 方法。

于 2010-12-01T16:49:13.750 回答
1

如果我要在项目中非常频繁地使用它,我会亲自为此制作一个扩展方法。如果它是一个关闭那么我不会打扰,但它不是真正糟糕的做法。

我这样做的原因是因为 if() 对正在发生的事情一目了然。好吧,任何有脑细胞的人都会知道当前语句在做什么,但它只是读起来更好。然后每个人都会有自己的喜好...

我做了一个格式化字符串的扩展方法,只是为了让代码流更好......

于 2010-12-01T16:50:15.233 回答
1

!something不起作用时,然后回退到something == false.

于 2010-12-01T16:53:45.140 回答
1

我更喜欢选项 1 而不是选项 2。扩展方法非常酷,非常适合用于经常使用的转换或比较之类的事情。但是,Microsoft 确实建议谨慎使用扩展方法。

于 2010-12-01T17:19:18.707 回答
1

我真的会认为扩展方法除了否定表达式之外什么都不做是不好的做法。

关于什么:

if (stringArray.Contains(searchString) == false)
{
    //do something
}
于 2010-12-01T17:30:27.417 回答