C # 'da Alt Liste Nasıl Elde Edilir


91

A var List<String>ve bu listeden bir alt liste çıkarmam gerekiyor. NET 3.5'te bunun için herhangi bir List yöntemi var mı?


Bize sahip olduklarınızın bir kod örneğini gösterebilir misiniz veya açıklayabilir misiniz? Soruyu takip etmiyorum.
David

Listemde List <String> list = new list <String> (); bu listeden bir alt liste
çıkarmam

Yanıtlar:


131

List :: GetRange (firstIndex, count) istiyorsunuz. Bkz. Http://msdn.microsoft.com/en-us/library/21k0e39c.aspx

// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)

Peşinde olduğun bu mu?

Alt liste öğelerini orijinal listeden silmek istiyorsanız, şunları yapabilirsiniz:

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}

4
Bir foreach ile üzerinde yinelerken bir listeden öğe kaldıramazsınız .....!
slugster

Slugster; 'A' listesinden silerken 'b' listesini yineliyorum. Yasal :)
Josh

6

Listenizde LINQ sorgusu çalıştırmak kadar kolay olur mu?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();

1
Bu, orijinal listenin segmentinin bir kopyasıdır, orijinal listenin bir kısmının görünümü değildir.
Asad Saeeduddin

@Asad Bu cevabın amacı, OP'nin LINQ kullanabileceğini göstermekti. Bir kopya oluşturduğunu belirttiniz. Fantastik. Yetenekleriniz, 5,5 yıl önce bıraktığımdan daha iyi noktayı açıklamak için bu soruyu düzenlemede muhtemelen daha iyi kullanılabilir. Eğer onu düzenlerseniz, internet adaleti bilgiçlik liginde kredi alırsınız ve iyi kazanılmış olursunuz!
p.campbell

11
Ben ( diğer bazı insanlar gibi ), subListorijinal listeye değişebilir bir bakış açısı getiren Java'ya benzer bir şey arıyordum . Bu farklı davranıyor, ki bu hemen belli olmayabilir, bu yüzden bunu daha sonra gören herkesin yararına bunu belirtmenin yararlı olacağını düşündüm. Konu dışında, yoga ya da meditasyon ya da başka bir şey yapmak isteyebilirsiniz; hiçbir provokasyon olmaksızın delirmeye 0 gittin.
Asad Saeeduddin

3

LINQ'daki Where cümlesini kullanın:

List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");

var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");

Yukarıdaki ifadelerde "p" listede bulunan nesnedir. Yani bir veri nesnesi kullandıysanız, yani:

public class Client
{
    public string Name { get; set; }
}

o zaman linq'iniz şöyle görünür:

List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });

var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");

Detaylandırdıktan sonra, ilk örneğimi kullanın ve şunu ekleyin: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster

2

LINQ ile:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

Foreach'e ihtiyacınız varsa, ToList'e gerek yoktur:

foreach (string s in l.Skip(1).Take(2)){}

LINQ'nun avantajı, yalnızca bazı ana öğeleri atlamak istiyorsanız, şunları yapabilirsiniz:

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

yani, sayı / uzunluk vb. ile ilgilenmeye gerek yoktur.


0

Koleksiyon sınıfınız, filtreyi tanımlamak için aktarılan ölçütlere göre bir koleksiyon (alt liste) döndüren bir yönteme sahip olabilir. Foreach döngüsü ile yeni bir koleksiyon oluşturun ve dağıtın.

Veya yöntemin ve döngünün "filtrelenmiş" veya "etkin" bir bayrak (özellik) ayarlayarak mevcut koleksiyonu değiştirmesini sağlayın. Bu işe yarayabilir, ancak çok iş parçacıklı kodda sorunlara da neden olabilir. Koleksiyonun içeriğine başka nesneler bağlıysa, bu, verileri nasıl kullandığınıza bağlı olarak iyi veya kötü olabilir.


0

Bir alt listedeki öğeleri ters çevirin

int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));

0,1,4,3,2,5,6 verir


Rangetamsayı veri türüyle doğrudur. veri türünüz ise DataTimeve iki belirli tarih arasındaki kayıtların bir listesini almanız gerekiyorsa ne olur ?
Jogi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.