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?
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?
Câu trả lời:
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);
}
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();
subList
từ 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.
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");
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.
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.
Đả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
Range
là đú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à DataTime
và bạn cần truy xuất danh sách các bản ghi giữa hai ngày cụ thể?