ชื่อคือคำถามทั้งหมด ใครช่วยให้เหตุผลว่าทำไมสิ่งนี้ถึงเกิดขึ้น
ชื่อคือคำถามทั้งหมด ใครช่วยให้เหตุผลว่าทำไมสิ่งนี้ถึงเกิดขึ้น
คำตอบ:
ใช่ - เพราะมันขึ้นต้นด้วยสตริงว่าง แท้จริงแล้วสตริงว่างเกิดขึ้นอย่างมีเหตุผลระหว่างคู่ของอักขระทุกตัว
พูดอย่างนี้: คำจำกัดความของ "เริ่มต้นด้วย" อะไรที่คุณสามารถให้คำจำกัดความนี้ได้? นี่คือคำจำกัดความง่ายๆของ "เริ่มต้นด้วย" ที่ไม่ได้:
"x เริ่มต้นด้วย y ถ้าy.Length
อักขระตัวแรกของ x ตรงกับ y"
นิยามทางเลือก (เทียบเท่า):
"x เริ่มต้นด้วย y if x.Substring(0, y.Length).Equals(y)
"
ฉันจะพยายามอธิบายรายละเอียดเกี่ยวกับสิ่งที่ Jon Skeet พูด
สมมติว่า x, y และ z เป็นสตริงและตัวดำเนินการ + คือการเชื่อมต่อกันจริงแล้ว:
ถ้าเราแบ่ง z เพื่อเขียน z = x + y นั่นหมายความว่า z เริ่มต้นด้วย x เนื่องจากทุกสตริง z สามารถแยกเป็น z = "" + z ตามที่ทุกสตริงเริ่มต้นด้วย ""
ดังนั้นเนื่องจาก ("" + "abcd") == "abcd" ตามหลังว่า "abcd" ขึ้นต้นด้วย ""
ฉันจะเริ่มต้นด้วยข้อเท็จจริงที่เกี่ยวข้องซึ่งเข้าใจง่ายกว่า
เซตว่างคือเซตย่อยของทุกเซต
ทำไม? นิยามของเซตระบุว่าA
เป็นส่วนหนึ่งของB
ถ้าองค์ประกอบของทุกองค์ประกอบของA
B
ตรงกันข้ามA
ไม่ได้เป็นส่วนหนึ่งของB
ถ้ามีองค์ประกอบของที่ไม่ได้องค์ประกอบของA
B
B
ตอนนี้แก้ไขชุด B
ฉันจะสร้างที่เซตว่างเป็นส่วนหนึ่งของ B
ฉันจะทำเช่นนี้โดยแสดงให้เห็นว่ามันไม่ได้เป็นกรณีที่เซตว่างไม่ได้เป็นส่วนหนึ่งของ ถ้าเซตว่างไม่ได้เป็นส่วนหนึ่งของแล้วฉันจะหาองค์ประกอบของชุดว่างเปล่าที่ไม่ได้อยู่ในB
B
แต่เซตว่างไม่ได้มีองค์ประกอบใด ๆ B
และทำให้ฉันไม่สามารถหาองค์ประกอบที่ไม่ได้อยู่ใน B
ดังนั้นจึงไม่ได้เป็นกรณีที่เซตว่างไม่ได้เป็นส่วนหนึ่งของ B
ดังนั้นเซตว่างจะต้องเป็นส่วนหนึ่งของ
สตริงใด ๆ เริ่มต้นด้วยสตริงว่าง
อันดับแรกเราต้องยอมรับในความหมายของเราเริ่มต้นด้วย ให้s
และt
จะstring
s เรากล่าวว่าs
เริ่มต้นด้วย t
ถ้าs.Length >= t.Length
และเป็นครั้งแรกt.Length
ของตัวละครตรงกับt
s
นั่นคือs.Length >= t.Length
และสำหรับทุกInt32 index
สิ่ง0 <= index < t.Length
นั้นs[index] == t[index]
เป็นความจริง ในทางกลับกันเราจะบอกs
ว่าไม่ได้ขึ้นต้นด้วยt
คำสั่ง if
s.Length < t.Length
หรือs.Length >= t.Length
และมีInt32 index
เช่นนั้น0 <= index < t.Length
และs[index] != t[index]
เป็นความจริง. ในภาษาอังกฤษธรรมดาs
จะสั้นกว่าt
หรือหากไม่ได้มีตัวละครในที่ไม่ตรงกับตัวอักษรที่เป็นตำแหน่งเดียวกันในt
s
s
ตอนนี้แก้ไขสตริง ฉันจะสร้างที่s
เริ่มต้นด้วยสตริงว่าง ฉันจะทำโดยแสดงว่าไม่ใช่กรณีที่s
ไม่ได้ขึ้นต้นด้วยสตริงว่าง ถ้าs
ไม่เริ่มต้นด้วยสตริงว่างแล้วs.Length < String.Empty.Length
หรือs.Length >= String.Empty.Length
และมีดังกล่าวว่าInt32 index
0 <= index < String.Empty.Length
แต่s.Length >= 0
และString.Empty.Length
เท่ากับศูนย์ดังนั้นจึงเป็นไปไม่ได้สำหรับs.Length < String.Empty.Length
ที่จะเป็นจริง ในทำนองเดียวกันตั้งแต่ "String.Empty.Length is equal to zero, there is no
Int32 ดัชนีsatisfying
0 <= ดัชนี <String.Empty.Length` ดังนั้น
s.Length < String.Empty.Length
หรือs.Length >= String.Empty.Length
และมีInt32 index
เช่นนั้น0 <= index < String.Empty.Length
เป็นเท็จ ดังนั้นจึงไม่ใช่กรณีที่s
ไม่ได้ขึ้นต้นด้วยสตริงว่าง ดังนั้นs
ต้องเริ่มต้นด้วยสตริงว่าง
ต่อไปนี้คือการใช้งานโดยเริ่มต้นด้วยรหัสเป็นส่วนขยายstring
ของ
public static bool DoStartsWith(this string s, string t) {
if (s.Length >= t.Length) {
for (int index = 0; index < t.Length; index++) {
if (s[index] != t[index]) {
return false;
}
}
return true;
}
return false;
}
ข้อเท็จจริงที่เป็นตัวหนาสองข้อข้างต้นเป็นตัวอย่างของข้อความจริงที่ไม่ชัดเจน มันเป็นความจริงโดยอาศัยความจริงที่ว่าข้อความที่กำหนดพวกมัน ( เซตย่อยและขึ้นต้นด้วย ) เป็นปริมาณที่เป็นสากลเหนือจักรวาลว่างเปล่า ไม่มีองค์ประกอบใด ๆ ในชุดว่างดังนั้นจึงไม่มีองค์ประกอบใด ๆ ของชุดว่างที่ไม่มีในชุดคงที่อื่น ๆ ไม่มีอักขระในสตริงว่างดังนั้นจึงไม่มีอักขระเนื่องจากตำแหน่งบางตำแหน่งในสตริงว่างไม่ตรงกับอักขระในตำแหน่งเดียวกันในสตริงคงที่อื่น ๆ
วิธีนี้เปรียบเทียบพารามิเตอร์ value กับสตริงย่อยที่จุดเริ่มต้นของสตริงนี้ที่มีความยาวเท่ากับค่าและส่งกลับค่าที่ระบุว่าค่าเท่ากันหรือไม่ เพื่อให้เท่ากันค่าต้องเป็นสตริงว่าง (Empty) การอ้างอิงถึงอินสแตนซ์เดียวกันนี้หรือตรงกับจุดเริ่มต้นของอินสแตนซ์นี้
เป็นจริงถ้าลำดับอักขระที่แสดงโดยอาร์กิวเมนต์เป็นคำนำหน้าของลำดับอักขระที่แสดงโดยสตริงนี้ เท็จเป็นอย่างอื่น โปรดทราบด้วยว่า true จะถูกส่งกลับหากอาร์กิวเมนต์เป็นสตริงว่างหรือเท่ากับอ็อบเจ็กต์ String นี้ตามที่กำหนดโดยวิธีเท่ากับ (Object)
สมมติว่า"abcd".StartsWith("")
ส่งคืนเท็จ
ถ้าเป็นเช่นนั้นนิพจน์ต่อไปนี้ประเมินว่าเป็นจริงหรือเท็จ:
("abcd".Substring(0,0) == "")
ปรากฎว่า evals เป็นจริงดังนั้นสตริงจึงเริ่มต้นด้วยสตริงว่าง ;-) หรือพูดอีกอย่างคือสตริงย่อยของ "abcd" เริ่มต้นที่ตำแหน่ง 0 และมีความยาว 0 เท่ากับสตริงว่าง "" imo ตรรกะสวย
null
จะเป็นค่าตอบแทนที่เหมาะสมเท่า ๆ กัน
ใน C # นี่คือวิธีที่ข้อกำหนดบอกให้ตอบสนอง
เพื่อให้เท่ากันค่าต้องเป็นสตริงว่าง (Empty) การอ้างอิงถึงอินสแตนซ์เดียวกันนี้หรือตรงกับจุดเริ่มต้นของอินสแตนซ์นี้
อักขระ N ตัวแรกของสองสตริงเหมือนกัน N คือความยาวของสตริงที่สองคือศูนย์
ทำไม“ abcd” .StartsWith (“”) จึงคืนค่าจริง
คำตอบที่แท้จริง:
มันต้องเป็นอย่างนั้นไม่งั้นคุณจะมีกรณีที่ไหน
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
จากนั้นเราจะมี Y2K อีกครั้งเพราะซอฟต์แวร์ของธนาคารทั้งหมดที่ขึ้นอยู่กับสตริงที่เท่าเทียมกันเริ่มต้นด้วยตัวเองจะทำให้บัญชีของเราปนกันและทันใดนั้น Bill Gates ก็จะมีความมั่งคั่งของฉันและฉันก็มีของเขาและด่ามัน! โชคชะตาไม่ได้เป็นแบบนั้นสำหรับฉัน
สำหรับเร็กคอร์ดString.StartsWith()
เรียกใช้เมธอดภายในSystem.Globalization.CultureInfo.IsPrefix()
ซึ่งทำการตรวจสอบต่อไปนี้อย่างชัดเจน:
if (prefix.Length == 0)
{
return true;
}
เนื่องจากสตริงขึ้นต้นด้วย "nothing"
ถ้าคุณคิดในแง่ของนิพจน์ทั่วไปก็สมเหตุสมผลดี ทุกสตริง (ไม่ใช่แค่ "abcd" รวมถึง "" และ "sdf \ nff") จะคืนค่าจริงเมื่อประเมินนิพจน์ทั่วไปของ "เริ่มต้นด้วยสตริงว่าง"