2012-10-30 21 views
23

Belirli bir aralıktaki tüm öğeleri bir listeden seçip yeni bir tanesine koymanın en etkili yolu ne olurdu? Belirli bir aralıktaki öğeler (3 - 7) listeden nasıl alınır?

List<DataClass> xmlList = new List<DataClass>(); 

Bu

benim Liste ve ben aralıkta (3-7) arasındaki tüm DataClass öğeleri koymak istiyorum yeni Listesinde.

En verimli yol ne olurdu? Bir aralıktaki öğeler arasında yer alan ve bu öğeleri yeni listeye ekleyene kadar her zaman + + sayılan bir foreach döngüsü.

+0

[başlangıç ​​ve bitiş endeksleri ile Listesi bir kısmını kapma] olası yinelenen (http://stackoverflow.com/questions/11566857/grabbing-a-part-of-the-listitem-by- başlangıç ​​ve bitiş indisleri) – nawfal

cevap

51

aradığınız yöntem GetRange geçerli: Özetle itibaren

List<int> i = new List<int>(); 
List<int> sublist = i.GetRange(3, 4); 

var filesToDelete = files.ToList().GetRange(2, files.Length - 2); 

:

// Summary: 
//  Creates a shallow copy of a range of elements in the source System.Collections.Generic.List<T>. 
// Parameters: 
// index: 
//  The zero-based System.Collections.Generic.List<T> index at which the range 
//  starts. 
// count: 
//  The number of elements in the range. 
18

Herhangi bir nedenle GetRange kullanmak beğenmezseniz yöntemi, LINQ kullanarak aşağıdakileri de yazabilirsiniz.

List<int> list = ... 
var subList = list.Skip(2).Take(5).ToList(); 
+1

Bunun yerine 'ToList' uzantısını kullanmanızı öneririm:' List copy = list.Skip (2) .Take (5) .ToList() '. Temelde aynı şeyi yapıyor ama bir LINQ ifadesi için daha doğal bir uyum buluyorum. –

+0

@MartinLiversage Anonim bir yazıyla uğraşmadığınız sürece, görsel bir farklılık olduğunu unutmayın (bu durumda * * ToList'e * ihtiyacınız vardır). Fonksiyonel olarak, ikisi hemen hemen aynıdır. – Servy

+0

List .GetRange daha büyük koleksiyonlar için daha verimli olacak unutmayın: https://icodeit.wordpress.com/2012/08/27/performance-of-skip-and-take-in-linq-to-objects/ , http://geekswithblogs.net/BlackRabbitCoder/archive/2012/03/29/c.net-little-wonders-skip-and-take.aspx – nawfal

İlgili konular