2017-07-18 12 views
5

IList<>'un boş olup olmadığını kontrol etmeye çalışıyorum.Boole durumu için birleştirme nasıl yapılır?

var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject> 
if (Foo?.Any()) 
    // Do cool stuff with items in Foo 

Fakat koşulu ile bir hata var: 'bool'

örtülü dönüştürülemez 'bool' için. Açık dönüştürme (? Eğer bir döküm eksik)

Yani koşul null bool olarak değerlendirilirse görünüyor var, bu yüzden

if (Foo?.Any().Value()) 

denemek Ama bu hiç iyi biri geçerlidir:

'bool' falan filan

Yani f 'değeri' için bir tanım ve hiçbir uzantı .... içermiyor irst örneği nullable bir bool olduğu konusunda şikayet eder ancak ikincisinde bunun olmadığını iddia eder.

if (Foo?.Any() == true) 

Bu işleri - ama bu ilk mesaj bu istemediğini söyledi örtük dönüştürme kullandığı olmamalıdır çünkü: Başka bir caddede olarak

denerim!

Neler oluyor? Bunu yapmanın doğru yolu nedir?

+0

if (? Foo .Count> 0) {} –

+1

@ AndzejMaciusovic: Bu kötü bir yol. Foo' aslında tamamen yürütmek için saatler süren bir soruysa, 'Any' badly' ı kaçıracaksınız. En az bir tane olup olmadığını bilmek istiyorsanız, hepsini hesaba katmayın. –

+1

@TimSchmelter Örneğimde kullanıyorum .Count değil sayıyorum() .Count zaten IList üzerinde hesaplanan alan, aslında kullanmak için biraz daha hızlıdır.. Yerine Yerine(). Listede. –

cevap

7
Eğer == kullanıyorsanız, bu gerçekten de en iyi/en basit yaklaşım bool? ile karşılaştırabilirsiniz

: bir if ama == ile izin verilmez neden olarak

if (Foo?.Any() == true) ... 

, Jon Skeet can explain o çok daha iyi:

Nullable'den bool'a hiçbir dolaylı dönüşme yoktur. , boole'dan Nullable'a dolaylı bir dönüşüm vardır ve bu, 'un, ilk sürümündeki bool sabitlerinin her birine (dil cinsinden) gerçekleşmesidir. BOOL operatör == (null, Null operatör uygulandı ve (Bu, diğer kaldırdı operatör oldukça aynı değildir -.. Sonuç, BOOL, sadece null değildir)

Diğer bir deyişle, sentezleme ' fred 'tiptedir null dolayısıyla Yani if verir ifadesi 'eğer'.

sadece bool ama senin kadar kullanamazsınız fred == false' ifadesi ise, türü bool olduğunu' bool? var, ancak == işleci bool değerini bool?'a dönüştürüyor ve d iki bool?'u karşılaştırabilirsiniz.

+2

OP zaten çalıştı Bu _This çalışır - ama bu ilk mesajın istemediğini söyledi bir örtülü dönüşüm kullandığı için değil çünkü yapmamalı! _ – Pikoh

+1

@Pikoh: sabit :) –

+1

@JonSkeet kartını kullanma huh? :) Doğru, şimdi açıklıyor, +1 – Pikoh

3

Düzenleme:

O Foo?.Any() kendisidir bool? nedeni gibi görünüyor.Eğer true ile karşılaştırmak istemiyorum, ben geçici değişken olması öneririm: Nesne bir sınıf ise

bool? any = Foo?.Any(); 
if (any.Value) ... 

Alternatif olarak, durumu kontrol etmek kadar FirstOrDefault() != null kullanabilirsiniz.

if (Foot?.FirstOrDefault() != null)... 

Ben geçici değişken veya gerçi Foo?.Any() == true seçeneğiyle gidecek: Bu sadece ilk nesne alacak çünkü zaman almayacaktır. Orijinal

:

Not: if (a?.Any()).Value() veya .Value tarafından takip edilemez o da benim için sürpriz olduğunu (!).

ne ihtiyacınız () (yöntemiyle) olmadan Value (mülkiyet) olduğunu düşünüyorum:

if (Foo?.Any()?.Value) ... 

bool?.Value (özelliğine) sahip bir bool olan.

1

Any() döner bool ama Foo?.Any()Any() üyesi Value sahip olmayan bir bool döndürür beri

bool? Yani Foo?.Any().Value derlemek olmaz dönecektir. ifadesi ?. operatör arkasında parçasını yorumlama olmadan null dönecektir çünkü

Foonull ise, Any() yürütülmez. Eğer parantez içinde Foo?.Any() koyarsanız

Ama, tip bool? sonucu ile çalışmak ve Value veya GetValueOrDefault() aracılığıyla kontrol edebiliyoruz:

(Foo?.Any()).GetValueOrDefault()