2012-10-30 9 views
23

Was wäre die effizienteste Methode, alle Elemente in einem bestimmten Bereich aus einer Liste auszuwählen und in eine neue Liste einzufügen?Wie erhalten Sie Artikel in einem bestimmten Bereich (3 - 7) von der Liste?

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

Dies ist meine Liste, und ich möchte alle Dataclass Elemente zwischen dem Bereich setzen (3 bis 7) in einer neuen Liste.

Was wäre der effizienteste Weg? Eine foreach-Schleife, die jedesmal ++ zählt, bis er die Elemente zwischen einem Bereich erreicht und diese Elemente zur neuen Liste hinzufügt?

+0

möglich Duplikat [einen Teil der Liste von Start- und Zielindizes Grabbing] (http://stackoverflow.com/questions/11566857/grabbing-a-part-of-the-listitem-by- Start-und-End-Indizes) – nawfal

Antwort

51

Die Methode, die Sie suchen sind, ist GetRange:

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

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

Aus der Zusammenfassung:

// 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

Wenn aus irgendeinem Grund mögen Sie nicht die GetRange verwenden können Sie auch Folgendes schreiben: LINQ.

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

Ich schlage vor, dass Sie stattdessen die Erweiterung 'ToList' verwenden:' Liste copy = list.Skip (2) .Take (5) .ToList() '. Es macht im Prinzip dasselbe, aber ich finde es natürlicher für einen LINQ-Ausdruck. –

+0

@MartinLiversage Beachten Sie, dass es sich lediglich um einen visuellen Unterschied handelt, es sei denn, Sie haben einen anonymen Typ (in diesem Fall benötigen Sie * 'ToList'). Funktional sind die beiden praktisch identisch. – Servy

+0

Beachten Sie, dass die Liste .GetRange effizienter für größere Sammlungen ist: 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

Verwandte Themen