Làm thế nào để có được một danh sách phụ trong C #


89

Tôi có một List<String>và tôi cần đưa một danh sách phụ ra khỏi danh sách này. Có bất kỳ phương pháp danh sách nào có sẵn cho việc này trong .NET 3.5 không?


Bạn có thể cho chúng tôi xem mẫu mã của những gì bạn có hoặc làm rõ không? Tôi không theo dõi câu hỏi.
David

Tôi có một danh sách nói rằng List <Chuỗi> list = danh sách mới <Chuỗi> (); tôi cần đưa một danh sách phụ ra khỏi danh sách này, nói từ chỉ mục 2 đến độ dài 1 ..
Thomas Manalil

Câu trả lời:


129

Bạn muốn Danh sách :: GetRange (firstIndex, count). Xem 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)

Đó có phải là những gì bạn đang theo đuổi?

Nếu bạn đang tìm cách xóa các mục trong danh sách phụ khỏi danh sách ban đầu, thì bạn có thể thực hiện:

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

4
Bạn không thể xóa các mục khỏi danh sách trong khi lặp lại chúng bằng dấu trước .....!
slugster

Slugster; Tôi đang lặp lại danh sách 'b' trong khi xóa khỏi danh sách 'a'. Nó hợp pháp :)
Josh

6

Nó có dễ dàng như chạy một truy vấn LINQ trên Danh sách của bạn không?

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

1
Đây là bản sao của phân đoạn của danh sách gốc, không phải là bản xem trên một phần của danh sách gốc.
Asad Saeeduddin

@Asad Điểm của câu trả lời này là để minh họa rằng OP có thể sử dụng LINQ. Bạn đã chỉ ra rằng nó tạo ra một bản sao. Tuyệt diệu. Tài năng của bạn có lẽ có thể được sử dụng tốt hơn trong việc biên tập câu hỏi này để minh họa quan điểm thậm chí còn hay hơn những gì tôi đã đưa ra cách đây 5,5 năm. Nếu bạn chỉnh sửa nó, bạn sẽ nhận được tín dụng trong liên minh công lý internet của pedantry, và nó sẽ kiếm được rất nhiều!
p.campbell,

10
Tôi ( cũng như một số người khác ) đang tìm kiếm thứ gì đó tương tự như subListtừ Java, nó đưa ra một chế độ xem có thể thay đổi vào danh sách ban đầu. Điều này hoạt động khác nhau, có thể không rõ ràng ngay lập tức, vì vậy tôi nghĩ sẽ hữu ích nếu chỉ ra nó vì lợi ích của bất kỳ ai nhìn thấy điều này sau này. Lạc đề, bạn có thể muốn tập yoga hoặc thiền hoặc một cái gì đó; bạn đã đi đến 0 đến đỏ-mặt-điên mà không có bất kỳ khiêu khích nào.
Asad Saeeduddin

3

Sử dụng mệnh đề Where từ 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");

Trong các câu lệnh trên, "p" là đối tượng có trong danh sách. Vì vậy, nếu bạn đã sử dụng một đối tượng dữ liệu, tức là:

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

thì linq của bạn sẽ trông như thế này:

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

Sau khi bạn giải thích, hãy sử dụng ví dụ đầu tiên của tôi và thêm điều này: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster

2

Với LINQ:

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

Nếu bạn cần foreach, thì không cần ToList:

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

Lợi thế của LINQ là nếu bạn muốn bỏ qua một số yếu tố hàng đầu, bạn có thể:

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

tức là không cần quan tâm đến số lượng / độ dài, v.v.


0

Lớp tập hợp của bạn có thể có một phương thức trả về một tập hợp (danh sách con) dựa trên các tiêu chí được chuyển vào để xác định bộ lọc. Xây dựng một bộ sưu tập mới với vòng lặp foreach và chuyển nó ra ngoài.

Hoặc, có phương pháp và vòng lặp sửa đổi bộ sưu tập hiện có bằng cách đặt cờ (thuộc tính) "đã lọc" hoặc "hoạt động". Cái này có thể hoạt động nhưng cũng có thể gây ra lỗi trong mã đa luồng. Nếu các đối tượng khác mô tả nội dung của bộ sưu tập thì điều này tốt hoặc xấu tùy thuộc vào cách bạn sử dụng dữ liệu.


0

Đảo ngược các mục trong một danh sách phụ

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

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


Rangelà đúng với kiểu dữ liệu số nguyên. điều gì sẽ xảy ra nếu kiểu dữ liệu của bạn là DataTimevà bạn cần truy xuất danh sách các bản ghi giữa hai ngày cụ thể?
Jogi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.