2013-05-15 14 views
5
private void AllowOtherSelectors(bool value) 
    { 
     foreach (var c in this.Parent.Controls) 
     { 
      if (c == this) 
       continue; 
      if (!(c is RoundGroupedSelector)) 
       continue; 
      var rgs = c as RoundGroupedSelector; 

      rgs.AllowMultiple = value; 
     } 
    } 

Bu kod çalışıyor olsa da ... LINQ kullanmanın fayda sağlayabileceğini hissediyorum. Bu program, Atom işlemcili bir tablette kullanılacaktır, bu yüzden sadece kullanılan en az kaynakları/döngüleri arıyorum.LINQ kullanarak aynı özelliği birden fazla Nesnede nasıl değiştirebilirim?

cevap

11

Eh, ben hala foreach döngü kullanmak istiyorum, ama sorgu bölümü için LINQ kullanabilirsiniz:

foreach (var c in Parent.Controls 
         .OfType<RoundGroupedSelector>() 
         .Where(x => x != this)) 
{ 
    c.AllowMultiple = value; 
} 
+2

'rgs'' c' olmalıdır –

+1

@RobertSnyder John, eğer yanılıyorsam beni düzeltebilir ama LINQ, iterasyondan daha iyi bir performans sunmuyor. Performanstan beri sadece genel bir şey burada önemli. – evanmcdonnal

1

Kesinlikle Jon'un cevabını gider, ama sadece "az döngüleri hakkında noktayı ele almak belki biraz daha hızlı bu şekilde yapabiliriz "kullandı:

private void AllowOtherSelectors(bool value) 
{ 
    var saved = this.AllowMultiple; 

    foreach (var c in this.Parent.Controls) 
    { 
     var rgs = c as RoundGroupedSelector; 

     if (rgs != null) 
      rgs.AllowMultiple = value; 
    } 

    this.AllowMultiple = saved; 
} 

Ben döngü önce this.AllowMultiple bir kopyasını yapmak ve sonra geri yükleyerek yineleme başına if (c == this) testini kaçınmışlardır. Ayrıca is'un gereksiz kullanımını da kaldırdım.

Bu, yalnızca birkaç kontrol varsa ve this.AllowMultiple'un atanması çok hızlı ve yan etkisi olmadığında işleri hızlandıracaktır.

Bu tür mikro optimizasyonun genellikle tamamen anlamsız olan olduğunu ve bu tür bir şeyi yaparsanız gerçekten daha hızlı olup olmadığını görmek için almanız gerektiğini vurgulamalıyım.

Buraya sadece ilgi için gönderiyorum. Bunu kesinlikle yapman gerektiğini kesinlikle tavsiye etmiyorum! :)

+1

karakterimdeki önemli bir kusurun altını çiziyorsunuz. Bunun içine girdiği Form, bu RoundGroupedSelectors, 3 düğme ve muhtemelen 2 etiketin 3'üne sahip olacaktır. Döngüleri ile ilgili olmanın muhtemelen benim üzerimde bir utanç olduğunu söylediğiniz gibi. Programımı tabletlerden birine koydum ve harika çalışıyor. LINQ hiç bir şekilde yavaşlatmaz. –

+0

ama yazdıklarınız bilgime bir şeyler getirdi. Ben, null olarak döndürecek ve bir hata atmayacağımı bilmiyordum. Yasal olmayan bir operasyon yapacağımı düşündüm. –

+0

@RobertSnyder Hah, altıdan az kontrol ... Evet, Jon'un kodunu kullan. :) –

İlgili konular