Bir numarada tanımlanan öğelerin sayısını nasıl alabilirim?
Bir numarada tanımlanan öğelerin sayısını nasıl alabilirim?
Yanıtlar:
Enum.GetNames
Numaralandı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;
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ı MyEnum
aşağıdaki gibi hesaplanabilir.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
(3) 'te tanımlanan değerlerin sayısı MyEnum
aşağıdaki gibi hesaplanabilir.
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();
,.
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 .
Enum.GetValues (typeof (MyEnum)). Uzunluk;
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.
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.
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;
}
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.
Visual Basic için:
[Enum].GetNames(typeof(MyEnum)).Length
benimle çalışmadı ama
[Enum].GetNames(GetType(Animal_Type)).length
.