2012-11-21 11 views
18

Bazı IEnumberable ürün koleksiyonum var. Koleksiyonda belirli bir nesneyi bulmak için .Single() kullanıyorum.LINQ Single() 0 veya çoklu öğeler için istisna

Single() kullanmayı tercih ediyorum çünkü yalnızca belirli bir öğe bulunmalıdır. Bununla birlikte, eğer mevcut değilse, o zaman onu oluşturup koleksiyona eklemem gerekir.

Sorunum, Single() yüklemesiyle eşleşen bir öğe yoksa veya birden fazla öğe varsa, aynı hatayı atar. Fikrim, denemenin içine Single() çağrıyı koymak ve istisnayı yakalamak, öğeyi eklemek ve devam etmek oldu. Ancak, her iki senaryo da InvalidOperationException'u attığından, öğelerinden veya birden çok öğeden kaynaklanıp kaynaklanmadığını nasıl anlarım?

First()'u kullanabileceğimi biliyorum, ancak bu yalnızca bir tane olması gerektiği fikrini zorlamıyor (ekstra çalışma yapmadan).

Ben de Single() çağrısından önce Count() kullanabilirsiniz, ama bu sadece sensin istedikleriniz Single()

cevap

32

noktasını zayıflatmak gibi görünüyor SingleOrDefault()

"veya varsayılan" aslında başvuru için (null döndürür demektir tür) veya referans olmayan tip için varsayılan değer ne olursa olsun. Yer almak için yeni bir nesneyi yeniden oluşturmanız gerekecek.

+5

Öğe türü için varsayılan değeri döndürür. Referans türleri için null değil, ancak null olmayan null değer türleri için değil ... –

+1

... ve null işaretini zincirlemek istiyorsanız, bu gibi bir şey kullanabilirsiniz http://napoleonss.wordpress.com/2011/12/ 20/my-null kontrol /. – napoleonss

+0

@JonSkeet üzerinde varsayılanlar için geçerlidir. Yine de bir referans türü hakkında konuştuğunu düşündüm. –

4

Mantıksal kararlar almak için istisnalar kullanmak kaynak pahalı olduğundan, bu senaryoda try/catch kullanmayı önermem.

SingleOrDefault()'u kullanmanızı ve sonucun boş olup olmadığını kontrol etmenizi öneririz. Eğer öyleyse. Yaratılışını yap.

+4

"kaynak pahalı" - biraz eskiz/yanlış görünümdür. Burada sağlanan Rico Mariani bağlantısına bakın. http://stackoverflow.com/q/891217/16391. Mantıksal kararlar vermek için istisnalar kullanmanın kötü bir tasarım tercihi olduğunu kabul ediyorum. – StingyJack