ดัชนีของอาร์เรย์มีอยู่หรือไม่


91

ฉันได้รับรหัสบางอย่างในที่ทำงานซึ่งมีกลิ่นเหม็นมาก ฉันหวังว่าจะพบวิธีแก้ปัญหาที่ไม่เจ็บปวดที่สุดเท่าที่จะทำได้

มีวิธีตรวจสอบว่าตัวเลขที่กำหนดเองเป็นองค์ประกอบที่ถูกต้องในอาร์เรย์หรือไม่?

ตัวอย่าง - ฉันต้องการตรวจสอบว่าอาร์เรย์ [25] มีอยู่หรือไม่

โดยเฉพาะอย่างยิ่งฉันต้องการทำสิ่งนี้โดยไม่ต้องทำ foreach () ผ่านอาร์เรย์เพื่อค้นหาแถว

มีวิธีใดบ้างที่จะทำเช่นนี้หรือฉันติดอยู่กับ foreach loop?


คุณหมายความว่าคุณต้องการทราบว่ามีค่าบางค่าสำหรับอาร์เรย์ [x] == 25 หรือไม่? ฉันคิดว่าคุณกำลังทำให้คนสับสนเกี่ยวกับสิ่งที่คุณขอโดยถามว่าอาร์เรย์ [25] มีอยู่จริงหรือไม่ แน่นอนว่ามันมีอยู่หากมี 26 องค์ประกอบขึ้นไปในอาร์เรย์ แต่ฉันไม่คิดว่านั่นคือสิ่งที่คุณขอ
kevin42

โปรแกรมที่ฉันกำลังทำงานอยู่มีอาร์เรย์ที่เป็นไปได้สองอาร์เรย์ที่มีชื่อไฟล์เดียวกัน หนึ่งมี 21 องค์ประกอบและอื่น ๆ มี 30 สิ่ง ฉันต้องการค่าที่ array [25] ควรมีอยู่
splatto

คำตอบ:


145

ทดสอบความยาว

int index = 25;
if(index < array.Length)
{
    //it exists
}

3
ขอบคุณ. ไม่อยากจะเชื่อเลยว่าฉันไม่ได้คิดถึงคุณสมบัติ. Long!
splatto

13
ตรวจสอบให้แน่ใจว่าดัชนี> = 0 ด้วย
Andreas Grech

2
และตรวจสอบให้แน่ใจว่าอาร์เรย์นั้นไม่เป็นโมฆะ :)
Shimmy Weitzhandler

1
เนื่องจากดัชนี Array จำเป็นต้องเป็นลำดับใน C # ซึ่งเป็นจริง มีประเภทคอลเลกชันที่ไม่มีดัชนีตามลำดับ แต่ไม่ใช่ประเภท Array พื้นฐานใน C #
ถึง

106

คุณสามารถใช้ LINQ เพื่อทำสิ่งนั้นได้เช่นกัน:

var exists = array.ElementAtOrDefault(index) != null;

4
ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหาแทนการตรวจสอบความยาวอาร์เรย์ที่เงอะงะ
Starceaker

7
โน้ตเล็ก ๆ น้อย ๆnew object[]{ null }.ElementAtOrDefault(index)จะกลับมาnullตั้งแต่องค์ประกอบที่ 0 มี nullการใช้ElementAtOrDefaultไม่ใช่วิธีแก้ปัญหาที่ดีเยี่ยมสำหรับการตรวจสอบดัชนีอาร์เรย์ที่มีอยู่การตรวจสอบความเท่าเทียมกันที่เพิ่มเข้ามาในตอนท้ายทำให้ผลลัพธ์ไม่แน่นอน
Chris Marisic

@ChrisMarisic ช่วยยกตัวอย่างได้ไหม?
FMFF

2
@ChrisMarisic คุณสิทธิกำลังในกรณีที่คุณต้องการตรวจสอบสำหรับการดำรงอยู่เพียง array.Length > indexแต่ทำ
Shimmy Weitzhandler

2
@ChrisMarisic จริงๆแล้วนี่เป็นบันทึกสำคัญการแก้ปัญหาเช่นนี้จะนำไปสู่ข้อบกพร่องที่ซ่อนอยู่
amd

21

"เป็นองค์ประกอบที่ถูกต้อง" หมายความว่าอย่างไร คุณสามารถทำได้:

if (array.Length >= 26)

ซึ่งจะบอกคุณว่า 25 เป็นดัชนีที่ถูกต้องในอาร์เรย์หรือไม่ (สมมติว่าขอบเขตล่าง 0)

หากคุณต้องการทราบว่าเป็นค่าว่างหรือไม่ให้ใช้:

if (array[25] != null)

(หรือการรวมกันของทั้งสอง)

หากสิ่งเหล่านี้ไม่ได้ผลโปรดระบุความหมายที่ชัดเจนยิ่งขึ้นว่า "ถูกต้อง" สำหรับปัญหาของคุณ


3
สำหรับตัวอย่างที่สองฉันได้รับสิ่งนี้ Index was outside the bounds of the array
มูฮัมหมัดราฮีล

4
@raheel: ดูเหมือนว่าคุณควรจะใช้การทดสอบครั้งแรกแทน ...
Jon Skeet

12

สมมติว่าคุณต้องการตรวจสอบว่ารายการนั้นไม่เป็นโมฆะหรือไม่

if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
หมายเหตุ: มีการใช้&&ในif (array.Length > 25 && array[25] != null)ถ้าใช้เพียงครั้งเดียว&จะโยนยกเว้น IndexOutOfRange MSDN .
เช็ค

3
// I'd modify this slightly to be more resilient to a bad parameter
// it will handle your case and better handle other cases given to it:

int index = 25;

if (index >= 0 && index < array.Length)
{
    // Array element found
}

1

คุณสามารถใช้ความยาวของอาร์เรย์และดูว่าหมายเลขที่กำหนดเองของคุณพอดีกับช่วงนั้นหรือไม่ ตัวอย่างเช่นหากคุณมีอาร์เรย์ขนาด 10 อาร์เรย์ [25] จะไม่ถูกต้องเนื่องจาก 25 ไม่น้อยกว่า 10


1

คุณสามารถใช้รายการเพื่อตรวจสอบการมีอยู่ได้

List<int> l = new List<int>();
l.Add(45);
...
...

if (l.Count == 25) {
  doStuff();
}
int num = 45;
if (l.Contains(num)) {
  doMoreStuff();
}


0

คุณสามารถตรวจสอบได้ว่าดัชนีน้อยกว่าความยาวของอาร์เรย์หรือไม่ สิ่งนี้ไม่ได้ตรวจสอบค่าว่างหรือกรณีแปลก ๆ อื่น ๆ ที่สามารถกำหนดดัชนีได้ แต่ไม่ได้กำหนดค่าอย่างชัดเจน


0

คุณสามารถตรวจสอบความยาวของอาร์เรย์เพื่อดูว่ารายการ 25 ถูกต้องหรือไม่ในแง่ของการอยู่ในอาร์เรย์จากนั้นคุณสามารถใช้

if (array.Length > 25)
{ 
   if (array[25] != null)
   {
       //good
   }
}

เพื่อดูว่ามีการตั้งค่ารายการอาร์เรย์หรือไม่


0

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

การเปลี่ยนไปใช้พจนานุกรมแบบธรรมดาอาจเป็นทางเลือกที่ใช้ได้ในระยะสั้น เช่นเดียวกับการใช้คลาสกระเป๋าทรัพย์สินขนาดใหญ่ มีตัวเลือกมากมาย ปัญหาที่คุณมีในตอนนี้เป็นเพียงอาการของการออกแบบที่ไม่ดีคุณควรมองไปที่การแก้ไขปัญหาพื้นฐานแทนที่จะแก้ไขการออกแบบที่ไม่ดีดังนั้นตอนนี้ sorta ใช้งานได้เป็นส่วนใหญ่

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