C #을 사용하고 있으며 문자열에 *, &, # 등 10 개의 문자 중 하나가 포함되어 있는지 확인하고 싶습니다.
가장 좋은 방법은 무엇입니까?
답변
다음은 내 관점에서 가장 간단한 방법입니다.
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
또는 읽기 쉬운 형식으로 :
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
필요한 컨텍스트 및 성능에 따라 char 배열을 캐시 할 수도 있고 원하지 않을 수도 있습니다.
답변
다른 사람들이 말했듯이 IndexOfAny를 사용하십시오. 그러나 다음과 같이 사용합니다.
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
이렇게하면 호출 할 때마다 새 어레이를 만들지 않아도됩니다. 문자열은 일련의 문자 리터럴 인 IMO보다 스캔하기가 더 쉽습니다.
물론 이것을 한 번만 사용할 것이므로 낭비되는 생성이 문제가되지 않는다면 다음 중 하나를 사용할 수 있습니다.
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;
}
어떤 것이 더 읽기 쉬운 지, 다른 곳에서 구두점 문자를 사용할지 여부 및 메서드가 호출되는 빈도에 따라 다릅니다.
편집 : 문자열에 정확히 하나 의 문자 가 포함되어 있는지 확인하는 Reed Copsey의 방법에 대한 대안이 있습니다 .
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;
}
답변
문자가 포함되어 있는지 확인하려면 다른 곳에서 제안한대로 string.IndexOfAny를 사용하는 것이 좋습니다.
문자열 에 10 개의 문자 중 정확히 하나만 포함되어 있는지 확인 하려면 조금 더 복잡해집니다. 가장 빠른 방법은 교차로를 확인한 다음 중복을 확인하는 것입니다.
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(Char[])
다음은 Microsoft의 문서 입니다.
답변
var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};
foreach (var specialChar in specialChars.Where(str.Contains))
{
Console.Write(string.Format("string must not contain {0}", specialChar));
}
답변
여러분 모두 감사합니다! (그리고 주로 Jon!) :이를 통해 다음과 같이 작성할 수있었습니다.
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
특정 문자열이 실제로 가격인지 또는 ‘표시하기에 너무 낮음’과 같은 문장인지 감지하는 좋은 방법을 찾고있었습니다.