2012-04-04 14 views
96

tôi có một danh sách lưu trữ trong resultlist như sau:C# - Cách xóa mục khỏi danh sách?

var resultlist = results.ToList(); 

Nó trông giống như sau

ID FirstName LastName 
-- --------- -------- 
1 Bill  Smith 
2 John  Wilson 
3 Doug  Berg 

Làm thế nào để loại bỏ ID 2 từ danh sách?

Trả lời

188

List<T> có hai phương pháp bạn có thể sử dụng.

RemoveAt(int index) có thể được sử dụng nếu bạn biết chỉ mục của mục. Ví dụ:

resultlist.RemoveAt(1); 

Hoặc bạn có thể sử dụng Remove(T item):

var itemToRemove = resultlist.Single(r => r.Id == 2); 
resultList.Remove(itemToRemove); 

Khi bạn không chắc chắn mục thực sự tồn tại, bạn có thể sử dụng SingleOrDefault. SingleOrDefault sẽ trả lại null nếu không có mục nào (Single sẽ ném một ngoại lệ khi không thể tìm thấy mục). Cả hai sẽ ném khi có giá trị trùng lặp (hai mục có cùng số id).

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2); 
if (itemToRemove != null) 
    resultList.Remove(itemToRemove); 
+3

tốt, có thể 'var itemsToRemove = resultlist.Where (r => r.Id == 2); foreach (var itemToRemove trong ItemsToRemove) resultList.Remove (itemToRemove); ' – Vlad

+0

Không nên là' resultlist.Items.RemoveAt (1); '? – Obsidian

29
resultList = results.Where(x=>x.Id != 2).ToList(); 

Có một chút LINQ helper tôi thích đó là dễ dàng để thực hiện và có thể làm cho các truy vấn với "nơi không phải là" điều kiện một chút dễ dàng hơn để đọc:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate) 
{ 
    return source.Where(x=>!predicate(x)); 
} 

//usage in above situation 
resultList = results.ExceptWhere(x=>x.Id == 2).ToList(); 
+1

Một cách tiếp cận tương tự khác (sử dụng biến vị ngữ) là sử dụng 'List.FindIndex' /' List.RemoteAt' (có tính năng "đẹp" hoặc "không quá đẹp" là thao tác biến đổi). –

+0

Đúng, nhưng hãy cẩn thận khi nói rằng hoạt động của Danh sách * là * biến đổi. Danh sách sử dụng một mảng đằng sau hậu trường và nó có thể tạo lại mảng của nó với dung lượng nhỏ hơn hoặc lớn hơn khi nó cho rằng cần thiết. * Thông thường *, loại bỏ là một đột biến tại chỗ của mảng hiện có. – KeithS

+0

Đây không phải là chủ đề an toàn, và vì sự đơn giản của nó, bạn có thể sử dụng SingleOrDefault, nó không cần phải được chứa trong một phương thức tĩnh –

0

... hoặc chỉ resultlist.RemoveAt(1) nếu bạn biết chính xác chỉ mục.

+2

chỉ khi nó được sắp xếp theo 'ID'. – zzzzBov

3

Bạn không chỉ định những loại danh sách, nhưng danh sách chung có thể sử dụng một trong hai phương pháp RemoveAt(index), hoặc Remove(obj) phương pháp:

// Remove(obj) 
var item = resultList.Single(x => x.Id == 2); 
resultList.Remove(item); 

// RemoveAt(index) 
resultList.RemoveAt(1); 
4

Có cách tiếp cận khác. Nó sử dụng List.FindIndexList.RemoveAt.

Trong khi tôi sẽ lẽ sử dụng giải pháp được trình bày bởi KeithS (chỉ đơn giản Where/ToList) phương pháp này khác ở chỗ nó đột biến đối tượng danh sách ban đầu. Đây có thể là một tính năng tốt (hoặc xấu) "tùy thuộc vào sự mong đợi.

Trong mọi trường hợp, FindIndex (cùng với một người bảo vệ) đảm bảo RemoveAt sẽ được chính xác nếu có những khoảng trống trong các ID hoặc đặt hàng là sai, vv, và sử dụng RemoveAt (vs Remove) tránh một thứ hai O (n) tìm kiếm thông qua danh sách.

Dưới đây là một đoạn LINQPad:

var list = new List<int> { 1, 3, 2 }; 
var index = list.FindIndex(i => i == 2); // like Where/Single 
if (index >= 0) { // ensure item found 
    list.RemoveAt(index); 
} 
list.Dump();  // results -> 1, 3 

Chúc mừng mã hóa.

8

Câu trả lời ngắn:
results.RemoveAll(r => r.ID==2); sẽ loại bỏ các mục với ID 2 trong results (tại chỗ).

câu trả lời chi tiết:

Tôi nghĩ rằng đó là đơn giản để sử dụng .RemoveAll(), bởi vì bạn có thể có một danh sách các ID mục mà bạn muốn loại bỏ - vui lòng xem ví dụ sau.

Nếu bạn có:

class myClass { 
    public int ID; public string FirstName; public string LastName; 
} 

và giao một số giá trị results như sau:

var results=new List<myClass> { 
    new myClass() { ID=1, FirstName="Bill", LastName="Smith" }, 
    new myClass() { ID=2, FirstName="John", LastName="Wilson" }, 
    new myClass() { ID=3, FirstName="Doug", LastName="Berg" }, 
    new myClass() { ID=4, FirstName="Bill", LastName="Wilson" }, 
}; 

Sau đó, bạn có thể xác định một danh sách các ID để loại bỏ:

var removeList = new List<int>() { 2, 3 }; 

Và chỉ cần sử dụng quyền này để xóa chúng:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

Nó sẽ loại bỏ các mục 2 và 3 và giữ những vật dụng 1 và 4 - theo quy định của removeList. Lưu ý rằng điều này xảy ra tại chỗ, do đó không cần phải có thêm bất kỳ yêu cầu nào khác.

Tất nhiên, bạn cũng có thể sử dụng nó vào các mặt hàng duy nhất như:

results.RemoveAll(r => r.ID==4); 

nơi mà nó sẽ loại bỏ Bill với ID 4 trong ví dụ của chúng tôi.


DotNetFiddle: Run the demo

2

đơn giản hơn:

resultList.Remove(resultList.Single(x => x.Id == 2)); 

không có cần phải tạo ra một đối tượng var mới.

Các vấn đề liên quan