Bir numarada tanımlanan toplam öğe sayısı


Yanıtlar:


430

Enum.GetNamesNumaralandırmadaki tüm öğelerin adlarını temsil eden bir dizi döndüren statik yöntemi kullanabilirsiniz . Bu dizinin length özelliği, numaralandırmada tanımlanan öğe sayısına eşittir

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;

1
Kabul edildi ... İşte buldum bir bağlantı csharp411.com/c-count-items-in-an-enum
SO Kullanıcı

8
Enum.GetValues ​​da kullanılabilir.
Xonatron

6
Sistem ad alanını zaten eklemiyorsanız, System.Enum.GetNames.
Brett Pennings

4
Bu yüzden bugün bu sorunla tekrar karşılaştım; Aşağıdaki diğer cevaplarda açıklanan C stili hilesi sorunlu olarak listelenmiştir, ancak hem yukarıda listelenen Enum.GetValues ​​hem de Enum.GetNames, sabit bir uzunluk elde etmek için tamamen yeni bir dizi tahsis etme riski taşıyor gibi görünüyor ... , korkunç. Herkes bu yaklaşımın gerçekten dinamik tahsis edip etmediğini biliyor mu? Öyleyse, belirli kullanım durumları için, en esnek olmasa bile en performanslı çözüm çok uzak görünüyor.
J Trana

174

Soru:

Bir numarada tanımlanan öğelerin sayısını nasıl alabilirim?

"Eşya" sayısı gerçekten iki tamamen farklı anlama gelebilir. Aşağıdaki örneği ele alalım.

enum MyEnum
{
    A = 1,
    B = 2,
    C = 1,
    D = 3,
    E = 2
}

Tanımlanan "öğe" sayısı nedir MyEnum?

Ürün sayısı 5 mi? ( A, B, C, D, E)

Yoksa 3 mü? ( 1, 2, 3)

(5) 'de tanımlanan adların sayısı MyEnumaşağıdaki gibi hesaplanabilir.

var namesCount = Enum.GetNames(typeof(MyEnum)).Length;

(3) 'te tanımlanan değerlerin sayısı MyEnumaşağıdaki gibi hesaplanabilir.

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();

2
Son satırı yazmanın alternatif yolu var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();,.
Jeppe Stig Nielsen

3
Hayatımda şimdiye kadar tanıştığım böyle bir enumun 3 madde içerdiğini onaylayan herhangi bir geliştiriciyi düşünemiyorum.
motoDrizzt

2
motoDrizzt Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...;) gibi bir yazıcı sürücüsünün numarasında böyle bir şey bulabilirsiniz .
shA.t


14

Bu soruya C cevabında gördüğüm şık bir numara, numaraya son bir eleman ekleyin ve numarada kaç eleman olduğunu söylemek için kullanın:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

0 dışında bir başlangıç ​​değeri tanımladığınız durumda, öğe sayısını belirlemek için NumberOfTypes - Type1 kullanabilirsiniz.

Bu yöntemin Enum'u kullanmaktan daha hızlı olup olmayacağından emin değilim ve bunun için doğru yolu kabul edip etmeyeceğimizden de emin değilim, çünkü Enum'un bu bilgileri bizim için tespit etmesi gerekiyor.


1
Bu güzel çünkü XNA bunu yapabilirsiniz çünkü GetNames orada mevcut değil
Thiago Valle

Serin hile, bu da GetNames () daha hızlı olurdu çünkü onları saymak zorunda değilsiniz.
Jordan LaPrise

4
Foreach ile numaralandırmalar arasında dolaşan kodlara dikkat edin - dizilerinizin sonunu okuyabilirsiniz!
Michael Dorgan

4
Ayrıca, kendi değerlerini tanımlayan numaralara dikkat edin - genellikle bit bayrakları için sıralamalar kullanıyorum.
Matt Parkins

1
Ayrıca, combobox ve listbox gibi bazı wpf kontrollerine doğrudan numaralandırma bağlarına dikkat edin
mcy

6

Önceki cevaplardan sadece kod örneği ekleyerek.

 class Program
    {
        static void Main(string[] args)
        {
            int enumlen = Enum.GetNames(typeof(myenum)).Length;
            Console.Write(enumlen);
            Console.Read();
        }
        public enum myenum
        {
            value1,
            value2
        }
    }

5

Numaralandırmanızda bir IEnumerable değeri döndürmek için Enum.GetNames kullanabilirsiniz ve sonra da ortaya çıkan IEnumerable'ı sayın.

GetNames, GetValues ​​ile aynı sonucu verir, ancak daha hızlıdır.


5

Kendinizi yukarıdaki çözümü yazarken bulduğunuzda, genel olarak uygulayabilirsiniz:

public static int GetEnumEntries<T>() where T : struct, IConvertible 
{
    if (!typeof(T).IsEnum)
        throw new ArgumentException("T must be an enumerated type");

    return Enum.GetNames(typeof(T)).Length;
}

1

Bunu şimdi inceliyordum ve mevcut çözümün okunabilirliğinden memnun değildim. Resmi olmayan bir şekilde veya küçük bir projede kod yazıyorsanız, numaralandırmanızın sonuna "Uzunluk" adlı başka bir öğe ekleyebilirsiniz. Bu şekilde, yalnızca şunu yazmanız gerekir:

var namesCount = (int)MyEnum.Length;

Tabii başkaları kodunuzu kullanacaksa - ya da bu durumda benim için geçerli olmayan diğer birçok koşulda eminim - bu çözüm, kötü tavsiye edilenlerden kötü tavsiye edilen herhangi bir yere olabilir.


2
Bu aynı zamanda 0'dan başlayarak sıralamaya da bağlıdır (varsayılan, ancak hiçbir şekilde garanti edilmez). Ek olarak, normal numaralandırma kullanımı için zekayı çok kafa karıştırıcı yapar. Bu neredeyse her zaman korkunç bir fikir.
BradleyDotNET

2
Bu uzun sürmedi :)
EnergyWasRaw

1
İlginç, sanırım daha iyi bir şeyin ne zaman ortaya çıkabileceğini asla bilemezsiniz. Kendi çözümümü kırmak için elimden geleni yaptım, ancak paylaşmak için yeterince ilginç buldum!
EnergyWasRaw

1

Visual Basic için:

[Enum].GetNames(typeof(MyEnum)).Lengthbenimle çalışmadı ama [Enum].GetNames(GetType(Animal_Type)).length.


Neden inişli çıkışlı? Bu sorun düzeltildi, soru c # olarak etiketlenmiş olsa bile, VB için doğru sözdizimi, hala yararlı.
M Granja

2
Downvotes muhtemelen soru C # olarak etiketlendiğinden ve bu cevap C # kullanmadığından bahsetmedi.
idbrii
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.