2009-08-17 26 views

cevap

10

olduğunu 42, 7 yazdırır: Kamarey işaret ettiği gibi, bir salt okunur manzarasına sahip olabilir LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

Bu, orijinal Listeye veya aralığın bir kopyasına bir görünüm kazandırır mı? –

+0

Sadece listede değil, IList üzerinde çalışıyor, aradığım şey buydu. – ripper234

+1

@Joachim Sauer: Bu bir sorgudur ve sonuç nasıl değerlendirildiğine bağlıdır. Değerlendirirken, bir kural uygulayan liste öğeleri arasında dolaşır. Bu, Java'nın subList işlevi için doğrudan analog değildir ve bu durumda bunları karşılaştırmak yanlıştır. – Kamarey

9

.

Düzenleme: bunun, orijinalde 'görünüm' değil, sığ bir kopya olduğunu unutmayın. Bence C# bu işlevselliği sunuyor.

Edit2:

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

yukarıda

+2

MSDN belgelerinden (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) aynı görünmüyor: subList() bir görünüm döndürürken, GetRange() sığ bir kopya döndürür (örn. subList() 'e yapılan değişiklikler orijinal listeye yansıtılacaktır!) –

+0

Tamam haklısınız. Bunun tam olarak gerekli olup olmadığından emin değilim, ancak cevabımı yansıtacak şekilde düzenlerim. – Razzie

1

GetRange 9. kullanarak cevap

+3

Tekrar: Tam olarak aynı şey değil, görünüm yerine sığ bir kopya döndürdüğü için. Bir görünümü döndürmek, bazı güzel şık hileler (örneğin, bir RemoveRange() yöntemi sağlamak için gereksiz hale getirir, çünkü list.subList (x, y) .clear()) olarak kolayca yazılabilir. –

+0

Dürüst olmak gerekirse, faydaları gerçekten görmediğimi söylemeliyim. Ayrıca, removeRange() ve subList.clear(), aynı şey gibi görünmez, çünkü temizleme bir aralığın kaldırılmasıyla aynı olmamalıdır. Ama oh iyi :-) – Razzie

+5

SubList() öğesinin orijinal Listeye bir görünüm döndürdüğü (ve bir kopyasını değil) kavramı okşadığınız anda, someList.subList (1,3) .clear() öğesinin belirgin olacağı aşikar olacaktır. Orijinal Listeden nesneleri kaldırın. Ve en önemli kısmı, daha iyi veya değil, değil, ama subList() ve GetRange() aynı şeyi yapmazlar, bu yüzden eşdeğer olarak sunulmamalıdırlar (en azından bir feragatname olmadan). –