检查一个string是否包含10个字符之一

我正在使用C#,我想检查一个string是否包含十个字符之一,*,&,#等等。

什么是最好的方法?

在我看来,以下是最简单的方法:

var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1 

或者在一个可能更容易阅读的forms:

 var match = str.IndexOfAny("*&#".ToCharArray()) != -1 

根据所需的上下文和性能,您可能希望或不希望caching字符数组。

正如其他人所说,使用IndexOfAny。 但是,我会这样使用它:

 private static readonly char[] Punctuation = "*&#...".ToCharArray(); public static bool ContainsPunctuation(string text) { return text.IndexOfAny(Punctuation) >= 0; } 

这样你就不会在每个调用中创build一个新的数组。 string也比一系列的字符文字,IMO更容易扫描。

当然,如果你只使用一次,所以浪费的创build不是一个问题,你可以使用:

 private const string Punctuation = "*&#..."; public static bool ContainsPunctuation(string text) { return text.IndexOfAny(Punctuation.ToCharArray()) >= 0; } 

要么

 public static bool ContainsPunctuation(string text) { return text.IndexOfAny("*&#...".ToCharArray()) >= 0; } 

这实际上取决于哪一个你find更多的可读性,无论你是否想在其他地方使用标点符号,以及该方法将被调用的频率如何。


编辑:这里是一个替代的里德·科普奇的方法来找出如果一个string恰好包含其中一个字符。

 private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#..."); public static bool ContainsOnePunctuationMark(string text) { bool seenOne = false; foreach (char c in text) { // TODO: Experiment to see whether HashSet is really faster than // Array.Contains. If all the punctuation is ASCII, there are other // alternatives... if (Punctuation.Contains(c)) { if (seenOne) { return false; // This is the second punctuation character } seenOne = true; } } return seenOne; } 

如果你只是想看看它是否包含任何字符,我build议使用string.IndexOfAny,如其他地方build议。

如果你想validation一个string只包含十个字符中的一个,并且只有一个,那么它会变得更复杂一些。 我相信最快的方法是检查交叉口,然后检查重复。

 private static char[] characters = new char [] { '*','&',... }; public static bool ContainsOneCharacter(string text) { var intersection = text.Intersect(characters).ToList(); if( intersection.Count != 1) return false; // Make sure there is only one character in the text // Get a count of all of the one found character if (1 == text.Count(t => t == intersection[0]) ) return true; return false; } 

string.IndexOfAny(…)

 var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'}; foreach (var specialChar in specialChars.Where(str.Contains)) { Console.Write(string.Format("string must not contain {0}", specialChar)); } 

感谢大家! (主要是乔恩!):这让我写这个:

  private static readonly char[] Punctuation = "$€£".ToCharArray(); public static bool IsPrice(this string text) { return text.IndexOfAny(Punctuation) >= 0; } 

因为我正在寻找一种很好的方法来检测某个string是否真的是一个价格或一个句子,比如“显示太低”。