Cara Mendapatkan Sublist di C #

91

Saya punya List<String>dan saya perlu mengeluarkan sublist dari daftar ini. Apakah ada metode Daftar yang tersedia untuk ini di .NET 3.5?

Thomas Manalil
sumber
Dapatkah Anda menunjukkan kepada kami contoh kode yang Anda miliki, atau mengklarifikasi? Saya tidak mengikuti pertanyaan itu.
David
Saya memiliki daftar mengatakan List <String> list = new list <String> (); saya perlu mengambil sublist dari daftar ini katakanlah dari indeks 2 ke panjang-1 ..
Thomas Manalil

Jawaban:

131

Anda ingin List :: GetRange (firstIndex, count). Lihat 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)

Itukah yang kamu cari?

Jika Anda ingin menghapus item sublist dari daftar asli, Anda dapat melakukan:

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}
Josh
sumber
4
Anda tidak dapat menghapus item dari daftar saat mengulanginya dengan foreach .....!
siput
Slugster; Saya mengulang daftar 'b' saat menghapus dari daftar 'a'. Ini legal :)
Josh
6

Apakah semudah menjalankan kueri LINQ di Daftar Anda?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
p. campbell
sumber
1
Ini adalah salinan dari segmen daftar asli, bukan tampilan atas sebagian dari daftar asli.
Asad Saeeduddin
@Asad Inti dari jawaban ini adalah untuk mengilustrasikan bahwa OP dapat menggunakan LINQ. Anda telah menunjukkan bahwa itu membuat salinan. Fantastis. Bakat Anda mungkin bisa digunakan dengan lebih baik dalam mengedit pertanyaan ini untuk mengilustrasikan poin yang bahkan lebih baik daripada yang saya tinggalkan 5,5 tahun yang lalu. Jika Anda mengeditnya, Anda akan mendapatkan kredit di liga pedantry keadilan internet, dan itu akan diterima dengan baik!
p. Campbell
11
Saya ( seperti beberapa orang lain ) sedang mencari sesuatu yang mirip dengan subListdari Java, yang memperlihatkan tampilan yang bisa berubah ke dalam daftar asli. Ini berperilaku berbeda, yang mungkin tidak langsung terlihat, jadi saya pikir akan sangat membantu untuk menunjukkannya untuk kepentingan siapa pun yang melihatnya nanti. Di luar topik, Anda mungkin ingin mengikuti yoga atau meditasi atau semacamnya; Anda menjadi 0 menjadi merah di wajah gila tanpa provokasi apapun.
Asad Saeeduddin
3

Gunakan klausa Where dari LINQ:

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");

Dalam pernyataan di atas, "p" adalah objek yang ada dalam daftar. Jadi jika Anda menggunakan objek data, yaitu:

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

maka linq Anda akan terlihat seperti ini:

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");
siput
sumber
Setelah Anda menjelaskan, gunakan contoh pertama saya dan tambahkan ini: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
siput
2

Dengan LINQ:

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

Jika Anda membutuhkan foreach, maka tidak perlu ToList:

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

Keuntungan LINQ adalah jika Anda ingin melewatkan beberapa elemen utama, Anda dapat:

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

yaitu tidak perlu memperhatikan hitungan / panjang, dll.

jw_
sumber
0

Kelas koleksi Anda bisa memiliki metode yang mengembalikan koleksi (sublist) berdasarkan kriteria yang diteruskan untuk menentukan filter. Buat koleksi baru dengan foreach loop dan bagikan.

Atau, minta metode dan perulangan memodifikasi koleksi yang ada dengan menyetel tanda "difilter" atau "aktif" (properti). Yang ini bisa berfungsi tetapi juga bisa menyebabkan poblems dalam kode multithread. Jika objek lain bergantung pada konten koleksi, ini baik atau buruk tergantung cara Anda menggunakan data.

Doug L.
sumber
0

Balikkan item dalam sub-daftar

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));

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

Phillip Ngan
sumber
Rangebenar dengan datatype integer. bagaimana jika tipe data Anda adalah DataTimedan Anda perlu mengambil daftar rekaman antara dua tanggal tertentu?
Jogi