2009-10-22 39 views

Trả lời

15

Nếu bạn có cả chìa khóa và giá trị mà bạn có thể làm như sau

public static void Remove<TKey,TValue>(
    this List<KeyValuePair<TKey,TValue>> list, 
    TKey key, 
    TValue value) { 
    return list.Remove(new KeyValuePair<TKey,TValue>(key,value)); 
} 

này hoạt động vì KeyValuePair<TKey,TValue> không ghi đè lên bình đẳng nhưng là một struct. Điều này có nghĩa là nó sử dụng bình đẳng giá trị mặc định. Điều này đơn giản so sánh các giá trị của các trường để kiểm tra tính bình đẳng. Vì vậy, bạn chỉ cần tạo một phiên bản KeyValuePair<TKey,TValue> mới với cùng các trường.

EDIT

Để đáp ứng với một commenter, những gì giá trị không một phương pháp mở rộng cung cấp ở đây?

Sự biện minh được nhìn thấy rõ nhất trong mã.

list.Remove(new KeyValuePair<int,string>(key,value)); 
list.Remove(key,value); 

Cũng trong trường hợp loại khóa hoặc giá trị là loại ẩn danh, cần có phương pháp tiện ích mở rộng.

EDIT2

Dưới đây là một ví dụ về cách để có được KeyValuePair mà một trong 2 có một loại vô danh.

var map = 
    Enumerable.Range(1,10). 
    Select(x => new { Id = x, Value = x.ToString() }). 
    ToDictionary(x => x.Id); 

Bản đồ biến là Dicitonary<TKey,TValue> trong đó TValue là một loại ẩn danh. Việc liệt kê bản đồ sẽ tạo ra một KeyValuePair với TValue là cùng một loại vô danh.

+0

Ngoài một vài lỗi cú pháp, giá trị này là phương pháp mở rộng có ý định p rovide? –

+1

@Derek, loại bỏ sự cần thiết phải chỉ định bất kỳ đối số chung nào cho định nghĩa kiểu khi thực hiện xóa. list.Remove (khóa, giá trị) so với list.Remove (new KeyValuePair (khóa, giá trị)). Trước đây là ngắn gọn hơn nhiều. Đừng nghĩ rằng -1 là xứng đáng với lỗi cú pháp nhỏ – JaredPar

+0

Tôi đã bỏ phiếu cho câu trả lời này vì tôi không cảm thấy việc sử dụng một phương pháp mở rộng đã cung cấp câu trả lời rõ ràng, ngắn gọn hoặc giá trị gia tăng, không phải do lỗi cú pháp. –

2

Nên có thể sử dụng .Remove(), .RemoveAt() hoặc một trong các phương pháp khác.

0
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(); 
    KeyValuePair<string, string> kvp = list[i]; 
    list.Remove(kvp); 

hoặc

list.Remove(list[1]); 

Bạn phải có một tham chiếu đến đối tượng mà bạn muốn loại bỏ - đó là lý do tại sao tôi tìm thấy mục Tôi đang tìm kiếm và được gán cho một KeyValuePair - kể từ khi bạn đang nói nó để loại bỏ một mục cụ thể.

Một giải pháp tốt hơn có thể được sử dụng một từ điển:

Dictionary<string, string> d = new Dictionary<string, string>(); 
    if (d.ContainsKey("somekey")) d.Remove("somekey"); 

này cho phép bạn loại bỏ bởi các giá trị quan trọng thay vì phải đối phó với những danh sách không được lập chỉ mục bởi chìa khóa.

Chỉnh sửa trước tiên bạn có thể không phải lấy tham chiếu KeyValuePair. Tuy nhiên, một từ điển có lẽ là một cách tốt hơn để đi.

2

Để loại bỏ tất cả các mục trong danh sách bằng chính:

myList.RemoveAll(x => x.Key.Equals(keyToRemove)); 
+0

Mặc dù không phải là câu trả lời được giải thích tốt nhất, điều này sẽ trong hầu hết các trường hợp thực sự làm các trick khi bạn có giá trị của chìa khóa để làm việc với. –

7

Dưới đây là một vài ví dụ về cách loại bỏ một mục từ một danh sách các KeyValuePair:

// Remove the first occurrence where you have key and value 
items.Remove(new KeyValuePair<int, int>(0, 0)); 

// Remove the first occurrence where you have only the key 
items.Remove(items.First(item => item.Key.Equals(0))); 

// Remove all occurrences where you have the key 
items.RemoveAll(item => item.Key.Equals(0)); 

EDIT

// Remove the first occurrence where you have the item 
items.Remove(items[0]); 
Các vấn đề liên quan