ทำไม“ abcd” .StartsWith (“”) จึงคืนค่าจริง


คำตอบ:


164

ใช่ - เพราะมันขึ้นต้นด้วยสตริงว่าง แท้จริงแล้วสตริงว่างเกิดขึ้นอย่างมีเหตุผลระหว่างคู่ของอักขระทุกตัว

พูดอย่างนี้: คำจำกัดความของ "เริ่มต้นด้วย" อะไรที่คุณสามารถให้คำจำกัดความนี้ได้? นี่คือคำจำกัดความง่ายๆของ "เริ่มต้นด้วย" ที่ไม่ได้:

"x เริ่มต้นด้วย y ถ้าy.Lengthอักขระตัวแรกของ x ตรงกับ y"

นิยามทางเลือก (เทียบเท่า):

"x เริ่มต้นด้วย y if x.Substring(0, y.Length).Equals(y)"


3
x เริ่มต้นด้วย y ถ้า x. Substring (0, y.Length). Equals (y) if and only if y.Length> 0
Vinko Vrsalovic

8
ใช่คุณสามารถยกเว้นกรณีนี้ได้อย่างชัดเจน มันเป็นคำจำกัดความที่ไม่สง่างามใช่มั้ย?
Jon Skeet

7
จริง. นอกจากนี้ยังกำหนดให้เป็นค่าว่างด้วยเช่นกัน ... แต่ฉันจะบอกว่าทั้งสองอย่างนี้เพิ่มความแม่นยำในขณะที่ละทิ้งจิตวิญญาณของคำจำกัดความง่ายๆ :)
Jon Skeet

8
การเกิดสตริงว่างไม่สิ้นสุดเกิดขึ้นระหว่างคู่ของอักขระทุกตัว
Lotus Notes

3
ใช่มันเหมือนกับการใส่ศูนย์ก่อนตัวเลข - มันไม่ได้เปลี่ยนค่า แต่ก็ยังมีอยู่
pop850

47

ฉันจะพยายามอธิบายรายละเอียดเกี่ยวกับสิ่งที่ Jon Skeet พูด

สมมติว่า x, y และ z เป็นสตริงและตัวดำเนินการ + คือการเชื่อมต่อกันจริงแล้ว:

ถ้าเราแบ่ง z เพื่อเขียน z = x + y นั่นหมายความว่า z เริ่มต้นด้วย x เนื่องจากทุกสตริง z สามารถแยกเป็น z = "" + z ตามที่ทุกสตริงเริ่มต้นด้วย ""

ดังนั้นเนื่องจาก ("" + "abcd") == "abcd" ตามหลังว่า "abcd" ขึ้นต้นด้วย ""


18

ฉันจะเริ่มต้นด้วยข้อเท็จจริงที่เกี่ยวข้องซึ่งเข้าใจง่ายกว่า

เซตว่างคือเซตย่อยของทุกเซต

ทำไม? นิยามของเซตระบุว่าAเป็นส่วนหนึ่งของBถ้าองค์ประกอบของทุกองค์ประกอบของA Bตรงกันข้ามAไม่ได้เป็นส่วนหนึ่งของBถ้ามีองค์ประกอบของที่ไม่ได้องค์ประกอบของAB

Bตอนนี้แก้ไขชุด Bฉันจะสร้างที่เซตว่างเป็นส่วนหนึ่งของ Bฉันจะทำเช่นนี้โดยแสดงให้เห็นว่ามันไม่ได้เป็นกรณีที่เซตว่างไม่ได้เป็นส่วนหนึ่งของ ถ้าเซตว่างไม่ได้เป็นส่วนหนึ่งของแล้วฉันจะหาองค์ประกอบของชุดว่างเปล่าที่ไม่ได้อยู่ในB Bแต่เซตว่างไม่ได้มีองค์ประกอบใด ๆ Bและทำให้ฉันไม่สามารถหาองค์ประกอบที่ไม่ได้อยู่ใน Bดังนั้นจึงไม่ได้เป็นกรณีที่เซตว่างไม่ได้เป็นส่วนหนึ่งของ Bดังนั้นเซตว่างจะต้องเป็นส่วนหนึ่งของ

สตริงใด ๆ เริ่มต้นด้วยสตริงว่าง

อันดับแรกเราต้องยอมรับในความหมายของเราเริ่มต้นด้วย ให้sและtจะstrings เรากล่าวว่า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หรือหากไม่ได้มีตัวละครในที่ไม่ตรงกับตัวอักษรที่เป็นตำแหน่งเดียวกันในts

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 noInt32 ดัชนีsatisfying0 <= ดัชนี <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;
}

ข้อเท็จจริงที่เป็นตัวหนาสองข้อข้างต้นเป็นตัวอย่างของข้อความจริงที่ไม่ชัดเจน มันเป็นความจริงโดยอาศัยความจริงที่ว่าข้อความที่กำหนดพวกมัน ( เซตย่อยและขึ้นต้นด้วย ) เป็นปริมาณที่เป็นสากลเหนือจักรวาลว่างเปล่า ไม่มีองค์ประกอบใด ๆ ในชุดว่างดังนั้นจึงไม่มีองค์ประกอบใด ๆ ของชุดว่างที่ไม่มีในชุดคงที่อื่น ๆ ไม่มีอักขระในสตริงว่างดังนั้นจึงไม่มีอักขระเนื่องจากตำแหน่งบางตำแหน่งในสตริงว่างไม่ตรงกับอักขระในตำแหน่งเดียวกันในสตริงคงที่อื่น ๆ


17

วิธีนี้เปรียบเทียบพารามิเตอร์ value กับสตริงย่อยที่จุดเริ่มต้นของสตริงนี้ที่มีความยาวเท่ากับค่าและส่งกลับค่าที่ระบุว่าค่าเท่ากันหรือไม่ เพื่อให้เท่ากันค่าต้องเป็นสตริงว่าง (Empty) การอ้างอิงถึงอินสแตนซ์เดียวกันนี้หรือตรงกับจุดเริ่มต้นของอินสแตนซ์นี้

.NET String.StartsWith

เป็นจริงถ้าลำดับอักขระที่แสดงโดยอาร์กิวเมนต์เป็นคำนำหน้าของลำดับอักขระที่แสดงโดยสตริงนี้ เท็จเป็นอย่างอื่น โปรดทราบด้วยว่า true จะถูกส่งกลับหากอาร์กิวเมนต์เป็นสตริงว่างหรือเท่ากับอ็อบเจ็กต์ String นี้ตามที่กำหนดโดยวิธีเท่ากับ (Object)

Java String.startsWith


13

สมมติว่า"abcd".StartsWith("")ส่งคืนเท็จ

ถ้าเป็นเช่นนั้นนิพจน์ต่อไปนี้ประเมินว่าเป็นจริงหรือเท็จ:

 ("abcd".Substring(0,0) == "")

ปรากฎว่า evals เป็นจริงดังนั้นสตริงจึงเริ่มต้นด้วยสตริงว่าง ;-) หรือพูดอีกอย่างคือสตริงย่อยของ "abcd" เริ่มต้นที่ตำแหน่ง 0 และมีความยาว 0 เท่ากับสตริงว่าง "" imo ตรรกะสวย


ความจริงที่ว่า "abcd" .ubstring (0, 0) ส่งคืนสตริงว่างไม่ได้หมายความว่า "abcd" เริ่มต้นด้วยสตริงว่าง ผลลัพธ์อาจได้รับการประกาศว่า 'ไม่ได้กำหนด' เช่นกันเนื่องจากnullจะเป็นค่าตอบแทนที่เหมาะสมเท่า ๆ กัน
Tom Lint

@TomLint ไม่ได้คุณมักจะรวมเงื่อนไข IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... สิ่งนี้ทำให้เงื่อนไขทำงานได้แม้ว่า valeus ที่ป้อนจะเป็นสตริงว่างเปล่าก็ตาม
Pop Catalin

7

ใน C # นี่คือวิธีที่ข้อกำหนดบอกให้ตอบสนอง

เพื่อให้เท่ากันค่าต้องเป็นสตริงว่าง (Empty) การอ้างอิงถึงอินสแตนซ์เดียวกันนี้หรือตรงกับจุดเริ่มต้นของอินสแตนซ์นี้


5

อักขระ N ตัวแรกของสองสตริงเหมือนกัน N คือความยาวของสตริงที่สองคือศูนย์


5

ทำไม“ abcd” .StartsWith (“”) จึงคืนค่าจริง

คำตอบที่แท้จริง:

มันต้องเป็นอย่างนั้นไม่งั้นคุณจะมีกรณีที่ไหน

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

จากนั้นเราจะมี Y2K อีกครั้งเพราะซอฟต์แวร์ของธนาคารทั้งหมดที่ขึ้นอยู่กับสตริงที่เท่าเทียมกันเริ่มต้นด้วยตัวเองจะทำให้บัญชีของเราปนกันและทันใดนั้น Bill Gates ก็จะมีความมั่งคั่งของฉันและฉันก็มีของเขาและด่ามัน! โชคชะตาไม่ได้เป็นแบบนั้นสำหรับฉัน


ฉันไม่เห็นด้วย. "" .startsWith ("") ควรเท่ากับจริงเพราะสตริงเหมือนกันไม่ใช่เพราะตรรกะทางธุรกิจแปลก ๆ
Tom Lint

@TomLint คุณกำลังเห็นด้วยกับคำยืนยันในคำตอบ ...
neonblitzer

4

สำหรับเร็กคอร์ดString.StartsWith()เรียกใช้เมธอดภายในSystem.Globalization.CultureInfo.IsPrefix()ซึ่งทำการตรวจสอบต่อไปนี้อย่างชัดเจน:

if (prefix.Length == 0)
{
    return true;
}

1

เนื่องจากสตริงขึ้นต้นด้วย "nothing"


1
... นั่นคือถ้า string.empty ไม่มีอะไร! การทำให้เข้าใจง่ายเกินไปนี้ไม่สามารถสรุปได้ทั่วไป ฉันขอแนะนำให้เราทำตามการอภิปรายที่เน้นทฤษฎีเซตมากขึ้น
Pita.O

1

ถ้าคุณคิดในแง่ของนิพจน์ทั่วไปก็สมเหตุสมผลดี ทุกสตริง (ไม่ใช่แค่ "abcd" รวมถึง "" และ "sdf \ nff") จะคืนค่าจริงเมื่อประเมินนิพจน์ทั่วไปของ "เริ่มต้นด้วยสตริงว่าง"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.