Chỉ mục của mảng có tồn tại không


90

Tôi đã thừa hưởng một số mã tại nơi làm việc có mùi rất khó chịu. Tôi hy vọng tìm ra giải pháp không đau nhất có thể.

Có cách nào để kiểm tra xem một số bất kỳ có phải là một phần tử hợp lệ trong một mảng không?

Ví dụ - Tôi cần kiểm tra xem mảng [25] có tồn tại hay không.

Tốt hơn là tôi muốn làm điều này mà không thực hiện foreach () qua mảng để tìm các hàng.

Có cách nào để làm điều này không, hoặc tôi bị mắc kẹt với vòng lặp foreach?


Có phải bạn muốn biết liệu một số giá trị cho mảng [x] == 25 không? Tôi nghĩ rằng bạn đang khiến mọi người bối rối về những gì bạn đang yêu cầu bằng cách hỏi liệu mảng [25] có tồn tại hay không. Chắc chắn nó tồn tại nếu có 26 phần tử trở lên trong mảng, nhưng tôi không nghĩ đó là những gì bạn đang yêu cầu.
kevin42

Chương trình tôi đang làm việc có hai mảng có thể có cùng tên tệp. Một cái có 21 phần tử và cái kia có 30 cái. Tôi cần giá trị tại mảng [25] nếu nó tồn tại.
splatto

Câu trả lời:


144

Kiểm tra độ dài

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

3
Cảm ơn. Tôi không thể tin rằng tôi đã không nghĩ đến thuộc tính .Length!
splatto

13
Đảm bảo rằng chỉ số> = 0.
Andreas Grech

2
Và chắc chắn rằng các mảng chính nó không phải là null :)
Shimmy Weitzhandler

1
Bởi vì chỉ mục Mảng được yêu cầu phải tuần tự trong C # nên điều này đúng. Có những kiểu tập hợp không có chỉ mục tuần tự, nhưng đó không phải là kiểu Mảng cơ bản trong C #.
reor

100

Bạn cũng có thể sử dụng LINQ để đạt được điều đó:

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

4
Cảm ơn, đây là những gì tôi đang tìm kiếm thay vì kiểm tra độ dài mảng vụng về.
Starceaker

6
Lưu ý nhỏ, new object[]{ null }.ElementAtOrDefault(index)sẽ trả về nullvì phần tử ở 0 null . Sử dụng ElementAtOrDefaultkhông phải là một giải pháp tuyệt vời để kiểm tra các chỉ số mảng tồn tại , việc kiểm tra tính bình đẳng được thêm vào cuối làm cho kết quả không xác định được.
Chris Marisic,

@ChrisMarisic Bạn có thể vui lòng cho một ví dụ không?
FMFF

2
@ChrisMarisic, bạn nói đúng, trong trường hợp bạn chỉ muốn kiểm tra sự tồn tại array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, thực sự đây là một lưu ý lớn, các giải pháp như thế này sẽ dẫn đến các lỗi ẩn
amd

21

Chính xác thì ý bạn là gì khi "là một phần tử hợp lệ"? Bạn chỉ có thể làm:

if (array.Length >= 26)

điều này sẽ cho bạn biết liệu 25 có phải là một chỉ mục hợp lệ trong mảng hay không (giả sử giới hạn dưới 0).

Nếu bạn cần biết liệu nó có phải là null hay không, chỉ cần sử dụng:

if (array[25] != null)

(Hoặc kết hợp cả hai).

Nếu những điều này không hữu ích, vui lòng cung cấp nghĩa chính xác hơn của "hợp lệ" cho vấn đề của bạn.


3
ví dụ thứ hai, tôi có cái này. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Vậy thì có vẻ như bạn cần phải có được sử dụng thử nghiệm đầu tiên thay vì ...
Jon Skeet

11

Giả sử bạn cũng muốn kiểm tra xem mục đó có rỗng không

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

1
Lưu ý: Phải sử dụng &&trong if (array.Length > 25 && array[25] != null), nếu sử dụng đơn &sẽ ném ngoại lệ IndexOutOfRange. MSDN .
tổng kiểm tra

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

Bạn có thể sử dụng độ dài của mảng và xem liệu số tùy ý của bạn có phù hợp với phạm vi đó hay không. Ví dụ: nếu bạn có một mảng có kích thước là 10, thì mảng [25] không hợp lệ vì 25 không nhỏ hơn 10.


1

Bạn có thể sử dụng Danh sách để kiểm tra sự tồn tại.

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

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

1

array.length sẽ cho bạn biết có bao nhiêu phần tử trong một mảng


0

Bạn có thể kiểm tra xem chỉ số có nhỏ hơn độ dài của mảng hay không. Điều này không kiểm tra các giá trị null hoặc các trường hợp kỳ lạ khác trong đó chỉ mục có thể được gán một giá trị nhưng chưa được cung cấp một cách rõ ràng.


0

Bạn có thể kiểm tra độ dài của mảng để xem liệu mục 25 có hợp lệ theo nghĩa nằm trong mảng hay không, sau đó bạn có thể sử dụng

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

để xem bản thân mục mảng đã được đặt chưa.


0

Nghe có vẻ giống như bạn đang sử dụng một mảng để lưu trữ các trường khác nhau. Đây chắc chắn là một mùi mã. Tôi tránh sử dụng mảng càng nhiều càng tốt vì chúng thường không phù hợp (hoặc cần thiết) trong mã cấp cao.

Chuyển sang một Từ điển đơn giản có thể là một lựa chọn khả thi trong ngắn hạn. Như sẽ sử dụng một lớp túi tài sản lớn. Có rất nhiều lựa chọn. Vấn đề bạn gặp phải bây giờ chỉ là một triệu chứng của thiết kế xấu, bạn nên xem xét việc khắc phục vấn đề cơ bản hơn là chỉ vá thiết kế xấu để nó gần như hoạt động, hiện tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.