Dizi Dizini Var mı


91

İşyerinde gerçekten kötü kokan bir kod miras aldım. Mümkün olan en acısız çözümü bulmayı umuyorum.

Bazı rasgele sayıların bir dizide geçerli bir öğe olup olmadığını kontrol etmenin bir yolu var mı?

Örnek - [25] dizisinin var olup olmadığını kontrol etmem gerekiyor.

Tercihen bunu, satırları bulmak için dizi üzerinden foreach () yapmadan yapmayı tercih ederim.

Bunu yapmanın bir yolu var mı yoksa foreach döngüsüne takılıp kaldım mı?


[X] == 25 dizisi için bir değer olup olmadığını bilmek istediğinizi mi söylüyorsunuz? Sanırım dizi [25] var mı diye sorarak ne istediğiniz konusunda insanları karıştırıyorsunuz. Elbette dizide 26 veya daha fazla eleman varsa var, ama istediğin şeyin bu olduğunu sanmıyorum.
kevin42

Üzerinde çalıştığım programın aynı dosya adına sahip iki olası dizisi var. Birinin 21 elementi, diğerinin ise 30'unun var. Varsa [25] dizisindeki değere ihtiyacım var.
51'de splatto

Yanıtlar:


145

Uzunluğu test edin

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

3
Teşekkürler. .Length özelliğini düşünmediğime inanamıyorum!
splatto

13
Dizinin> = 0 olduğundan da emin olun.
Andreas Grech

2
Ve dizinin kendisinin boş olmadığından emin olun :)
Shimmy Weitzhandler

1
Dizi dizinlerinin C # 'da sıralı olması gerektiğinden bu doğrudur. Sıralı dizinleri olmayan koleksiyon türleri vardır, ancak bunlar C # 'da temel Dizi türleri değildir.
reor

106

Bunu başarmak için de LINQ kullanabilirsiniz:

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

4
Teşekkürler, beceriksiz dizi uzunluğu kontrolü yerine aradığım şey buydu.
Starceaker

7
Minör not, new object[]{ null }.ElementAtOrDefault(index)dönecektir null0 elemanın beri olduğunu null . ElementAtOrDefaultDizi indekslerinin var olup olmadığını kontrol etmek için kullanmak harika bir çözüm değildir , sona eklenen eşitlik kontrolü sonuçları belirsiz hale getirir.
Chris Marisic

@ChrisMarisic Bir örnek verebilir misiniz?
FMFF

2
@ChrisMarisic haklısın, sadece var olup olmadığını kontrol etmek istersen array.Length > index.
Shimmy Weitzhandler

2
@ChrisMarisic, aslında bu önemli bir not, bunun gibi çözümler gizli hatalara yol açacak
amd

21

"Geçerli bir unsurdur" ile tam olarak neyi kastediyorsunuz? Yapabilirsin:

if (array.Length >= 26)

bu size 25'in dizi için geçerli bir dizin olup olmadığını söyler (0 alt sınırı varsayarak).

Boş olup olmadığını bilmeniz gerekiyorsa, şunu kullanın:

if (array[25] != null)

(veya ikisinin bir kombinasyonu).

Bunlar yardımcı olmazsa, lütfen sorununuz için daha kesin bir "geçerli" anlamı verin.


3
ikinci örnek için bunu aldım. Index was outside the bounds of the array
Muhammad Raheel

4
@raheel: Öyleyse bunun yerine ilk testi kullanman gerekiyor gibi görünüyor ...
Jon Skeet

12

Maddenin boş olup olmadığını da kontrol etmek istediğinizi varsayarsak

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

1
Not: Got kullanmak &&içinde if (array.Length > 25 && array[25] != null)kullanımı tek takdirde &IndexOutOfRange özel durum oluşturur. MSDN .
sağlama toplamı

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

Dizinin uzunluğunu kullanabilir ve rastgele sayınızın bu aralığa uyup uymadığını görebilirsiniz. Örneğin, 10 boyutunda bir diziniz varsa, [25] dizisi geçerli değildir çünkü 25, 10'dan küçük değildir.


1

Varlığını kontrol etmek için bir Liste kullanmayı tercih edebilirsiniz.

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

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


0

Dizinin, dizinin uzunluğundan az olup olmadığını kontrol edebilirsiniz. Bu, boş değerleri veya dizine bir değer atanabildiği, ancak açıkça bir değer verilmediği diğer garip durumları kontrol etmez.


0

25 öğesinin dizide olma anlamında geçerli olup olmadığını görmek için dizinin uzunluğunu kontrol edebilirsiniz, o zaman kullanabilirsiniz

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

dizi öğesinin kendisinin ayarlanıp ayarlanmadığını görmek için.


0

Farklı alanları depolamak için bir dizi kullanıyormuşsunuz gibi geliyor. Bu kesinlikle bir kod kokusu. Genellikle yüksek seviyeli kodda uygun olmadıklarından (veya gerekli olmadıklarından) mümkün olduğunca dizi kullanmaktan kaçınırdım.

Basit bir Sözlüğe geçmek kısa vadede uygulanabilir bir seçenek olabilir. Büyük mülk çantası sınıfında olduğu gibi. Çok fazla seçenek var. Şu anda sahip olduğunuz sorun sadece kötü bir tasarımın belirtisidir, kötü tasarımı yamamak yerine temeldeki sorunu çözmeye bakmalısınız, bu yüzden şimdilik çoğunlukla işe yarıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.