ฉันใช้ C # และฉันต้องการตรวจสอบว่าสตริงมีอักขระหนึ่งในสิบตัวหรือไม่, *, &, # ฯลฯ เป็นต้น
วิธีที่ดีที่สุดคืออะไร?
ฉันใช้ C # และฉันต้องการตรวจสอบว่าสตริงมีอักขระหนึ่งในสิบตัวหรือไม่, *, &, # ฯลฯ เป็นต้น
วิธีที่ดีที่สุดคืออะไร?
คำตอบ:
ต่อไปนี้เป็นวิธีที่ง่ายที่สุดในมุมมองของฉัน:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
หรือในรูปแบบที่อ่านง่ายกว่า:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
ขึ้นอยู่กับบริบทและประสิทธิภาพที่ต้องการคุณอาจต้องการหรือไม่ต้องการแคชอาร์เรย์ถ่าน
อย่างที่คนอื่นบอกให้ใช้ 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;
}
ToCharArray
แบบฟอร์ม "อินไลน์" ได้หากจำเป็น
หากคุณต้องการดูว่ามีอักขระหรือไม่ขอแนะนำให้ใช้ string.IndexOfAny ตามที่แนะนำไว้ที่อื่น
หากคุณต้องการตรวจสอบว่าสตริงมีอักขระหนึ่งในสิบตัวและมีเพียงตัวเดียวก็จะซับซ้อนขึ้นเล็กน้อย ฉันเชื่อว่าวิธีที่เร็วที่สุดคือตรวจสอบกับทางแยกจากนั้นตรวจสอบรายการที่ซ้ำกัน
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;
}
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;
}
ขณะที่ฉันกำลังค้นหาวิธีที่ดีในการตรวจสอบว่าสตริงนั้นเป็นราคาหรือประโยคเช่น 'ต่ำเกินไปที่จะแสดง'