2009-05-06 41 views
5

Sözlükten kaldırmak için bir Sözlük ve Anahtarlar listem var. Bu şu anda benim uygulamasıdır: Ben foreach döngüsü ortadan yapabileceği bir şeyBir sözlüğü "kesmek" için LINQ'u nasıl kullanabilirim?

var keys = (from entry in etimes 
      where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
      select entry.Key).ToList(); 

foreach (var key in keys) 
{ 
    etimes.Remove(key); 
    count--; 
} 

var mı?

+1

İhtiyacınız olmadığından .ToList() foreach, herhangi bir IEnumerable ile çalışacaktır –

+0

LINQ, varolan verileri dönüştürerek yeni veriler oluşturabilen bir sorgu dilidir. Mevcut verileri değiştiremez. – codymanix

cevap

6
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
     entry => entry.Value); 

Bu ifade yeterlidir (gösterdi, sonra başka bir kod gerektiren) için ürün çıkarmak için daha ziyade tutmak hangi seçmek için LINQ Where işlevini kullanarak sözlüğü filtreler. ToDictionary, Dictionary<TKey, TValue> türüne IEnumerable<KeyValuePair<TKey, TValue>> türünü dönüştürür ve KeyValuePair anahtarını ve değerini seçmek için iki lambda ifadesini belirtme gereksinimi nedeniyle son derece zarif veya verimli değilse en azından oldukça basittir (ve sonra yeni bir sözlük oluşturur)). Bunu söylerken, özellikle sözlük küçük ve/veya kaldırılan öğelerin sayısı büyükse, bunu bir sorun olarak görmüyorum.

+0

Bu arada performans hakkında yorum yapmak istemiyorum - eğer buna değer veriyorsanız, iki yöntemi test edin. Foreach kullanarak orijinal çözümünüzün * çok daha hızlı olacağından emin değilim. – Noldorin

+0

Performans konusunda endişelenmiyorum, sözlüğünde herhangi bir anda yalnızca birkaç tuş var. Sadece LINQ'un daha iyi bir tanıtımı yapmaya çalışıyorum. Teşekkürler, bu harika çalıştı. – scottm

+0

Bu, her bir döngü için basit olandan çok daha pahalı olabilir, çünkü yeni bir sözlük oluşturacaktır. Ve bence okunabilirliği de geliştirmiyor. Bu yüzden her bir döngü için yapışırdım ve belki de onu (uzantısı) bir yönteme taşırdım, fakat LINQ çözümü için hiç kazanç göremiyorum. –

0
Eh, performans veya okunabilirliği sorunları bir yana, bu da aşağıdaki gibi bir şey yapılabilir değil

: Özellikle C# tam sözdizimi (% 100 emin değilim benim kodlama Affet

<Extension> void itemDelete(List l, object item) { 
    l.Remove(item) 
} 

var keys = (from entry in etimes 
     where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
     select entry.Key).ToList(); 

keys.foreach(itemDelete()); 

); sözde kod düşünün. LINQ sorgusunun sonuna yeni işlevin ve .foreach işlevinin eklenmesine dikkat edin. Bu VB mümkün olacağını biliyorum, C# benzer bir şey var varsayalım ... Eğer her zaman kendi .foreach uzantısı yazabilirsiniz. Bir şeyi geliştirebilir veya geliştirmeyebilir, ancak bu bir fikirdir.

+0

Eğer bu aptal bir soru ise beni bağışla, ama bu Uzatma yöntemini kısmi bir sınıfta mı yaratırsın? Hala Uzantı yöntemleriyle ve bunları nasıl kullanabileceğinizi ve oluşturabileceğinizi anlamaya çalışıyorum. – Jagd

+0

@Jagd: Kısmi bir sınıfı kullanmak için hiçbir sebep yok. Önerilen uygulama, bir * statik sınıf * ve grup uzantısı yöntemlerinde kendi başlarına benzer işlevlerin statik sınıflarına bildirilmesidir. – Noldorin

+0

VB'de bunları Modüller içinde yaratırsınız, bu yüzden ... Noldorin'in En İyi Uygulamaları'nı dinlemeyi söyleyebilirim. – eidylon

İlgili konular