Tôi đang sử dụng C # và tôi muốn kiểm tra xem một chuỗi có chứa một trong mười ký tự, *, &, #, v.v.
cách tốt nhất là gì?
Tôi đang sử dụng C # và tôi muốn kiểm tra xem một chuỗi có chứa một trong mười ký tự, *, &, #, v.v.
cách tốt nhất là gì?
Câu trả lời:
Sau đây là phương pháp đơn giản nhất, theo quan điểm của tôi:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
Hoặc ở dạng có thể dễ đọc hơn:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
Tùy thuộc vào ngữ cảnh và hiệu suất được yêu cầu, bạn có thể muốn hoặc không muốn lưu mảng char vào bộ nhớ cache.
Như những người khác đã nói, hãy sử dụng IndexOfAny. Tuy nhiên, tôi sẽ sử dụng nó theo cách này:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
Bằng cách đó, bạn sẽ không phải tạo một mảng mới trên mỗi cuộc gọi. Chuỗi cũng dễ quét hơn một chuỗi các ký tự, IMO.
Tất nhiên nếu bạn chỉ sử dụng cái này một lần, vì vậy việc tạo lãng phí không phải là vấn đề, bạn có thể sử dụng:
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
hoặc là
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
Nó thực sự phụ thuộc vào việc bạn thấy dễ đọc hơn, bạn có muốn sử dụng các ký tự dấu câu ở nơi khác hay không và tần suất phương thức sẽ được gọi.
CHỈNH SỬA: Đây là một phương pháp thay thế cho phương pháp của Reed Copsey để tìm hiểu xem một chuỗi có chứa chính xác một trong các ký tự hay không.
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;
}
ToCharArray
biểu mẫu "inline" nếu được yêu cầu.
Nếu bạn chỉ muốn xem liệu nó có chứa bất kỳ ký tự nào không, tôi khuyên bạn nên sử dụng string.IndexOfAny, như được đề xuất ở những nơi khác.
Nếu bạn muốn xác minh rằng một chuỗi chứa chính xác một trong mười ký tự và chỉ một ký tự, thì nó sẽ phức tạp hơn một chút. Tôi tin rằng cách nhanh nhất sẽ là kiểm tra một Giao lộ, sau đó kiểm tra các bản sao.
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[])
Đây là tài liệu của Microsoft .
var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};
foreach (var specialChar in specialChars.Where(str.Contains))
{
Console.Write(string.Format("string must not contain {0}", specialChar));
}
Cảm ơn tất cả các bạn! (Và chủ yếu là Jon!): Điều này cho phép tôi viết điều này:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
vì tôi đang tìm kiếm một cách hay để phát hiện xem một chuỗi nhất định có thực sự là giá hay câu, chẳng hạn như 'Quá thấp để hiển thị'.