2013-05-21 15 views
5

şartlı params argümanlar var nasılbir işleve

public void Foo(string name, params object[] args) 

Ben değişebilir args listesiyle demek isterseniz var. Ben, b x 42 daha sonra geçmek ise yani, b, aksi takdirde geçmek c

Foo("yo",a,b,x==42?c); 

gibi bir şey yapmak gerekir. Tabii ki sözdizimi çalışmıyor. Biliyorum ki, yayları bir Listeye koyabiliyorum ve listeyi işleve iletebiliyordum, ancak bu kodun düzenlenme şeklini yapmak için çok dağınık olurdu.

if (x == 42) 
    Foo("yo", a, b, c); 
else 
    Foo("yo", a, b); 

Sen ?: kullanamazsınız: me sadece bir deyim varsa kullanabilirsiniz

var xml = new XDocument(...., 
    new XElement(....), 
    new XElement(....), 
    new XElement(....), 
    x==42? new XElement(.....), 
    new XElement(....), 
    new XElement(....) 
    .... 

cevap

10

beton durumda ilave edelim: Yani bazı sözdizimi sihirli i

DÜZENLEME kullanabilirsiniz yoktur Bu durumda operatör (en azından işlev çağrısının dışında), çünkü Foo dönüş değeri yoktur. ?: operatörünün bir şeyleri değerlendirmesi ve başka bir şeye bir şey atanması gerekir.

yinelenen işlev çağrısı kurtulmak istiyorum Başka bir seçenek parametreleri için bir dizi veya liste kullanmaktır:

var parameters = new List<object> { a, b }; 

if (x == 42) 
    parameters.Add(c); 

Foo("yo", parameters); 

Ve gerçekten orada ?: almak istiyorsa, bu da işe yarayacağını: XDocument/XElement yapıcı çağrıları hakkında, daha ayrıntılı soru için

Foo("yo", x == 42 ? new object[] { a, b, c } : new object[] { a, b }); 

, sen Add aramaları ziyade yapıcı aramaların tek bir uzun dizi kullanmak isteyebilirsiniz. Sonra onları şartlı yapabilirsiniz. Son bir

XDocument xml = new XDocument(); 
XElement root = new XElement("Root"); 
xml.Add(root); 

root.Add(new XElement("Item1")); 
root.Add(new XElement("Item2")); 
if (x == 42) 
    root.Add(new XElement("Item2.5")); 
root.Add(new XElement("Item3")); 
root.Add(new XElement("Item4")); 

Aslında: Böyle bir şey olmazdı Add görüşmelerini kullanma

XElement elementPrecedingOptionalElement = new XElement(...); 

var xml = new XDocument(...., 
    new XElement(...), 
    new XElement(...), 
    elementPrecedingOptionalElement, 
    new XElement(...), 
    new XElement(...) 
); 

if (x == 42) 
    elementPrecedingOptionalElement.AddAfterSelf(new XElement(...)); 

: olduğu gibi, ben de böyle bir şey yaparak soruyorsun ne mümkün olmalıdır düşünüyorum o (hangi soru ihtiyaçlarına en yakın olsa eğer o':

var xml = new XDocument(...., 
    new XElement(...), 
    new XElement(...), 
    new XElement(...), 
    x == 42 
     ? new XElement(...) 
     : null, 
    new XElement(...), 
    new XElement(...) 
); 
+0

+1 <> 'seçenek listesi' için: sizin için ne soruyorsun çok daha yakın olduğunu versiyon iş gördüğü görülen bu gibi olurdu O kadar "dağınık" olacak İD). –

+0

Bunun benim için neden çalışmadığını görmek için düzenlemeye bakın. PS Nasıl yapılacağını biliyorum, özellikle kolayca ve açık bir şekilde çalışıp çalışamayacağımı anlamaya çalışıyorum - özellikle de amacı netleştirmek istiyorum. Kullanmak için wnat yok mu?:, Sadece benim ilk denemem (hemen vazgeçtim) – pm100

+0

@ pm100 tamam güncellenmiş cevap –