2012-10-01 26 views
12

Tôi có một số List<KeyValuePair<string, othertype>>. Tôi cần phải làm điều gì đó dọc theo các dòng củaDanh sách <T>. Làm việc khi T là cấu trúc như thế nào?

list.Find(x=>x.Key=="foobar") 

Tuy nhiên, nếu điều đó không tồn tại trong danh sách, hành vi sẽ là gì? Thông thường nó sẽ trả về null, nhưng cấu trúc không thể rỗng.

+2

Hãy thử nó với 'int' và xem những gì sẽ xảy ra. – Oded

+2

Giá trị mặc định cho loại T, cụ thể hơn là 'mặc định (T)'. –

+0

Nếu bạn muốn Tìm để trả về null khi không tìm thấy kết quả phù hợp, hãy cân nhắc sử dụng Tuple thay vì KeyValuePair. – JamieSee

Trả lời

13

Nó sẽ trả lại default(T) sẽ giống như new KeyValuePair<string, othertype>>(), đó là cấu trúc khởi tạo mặc định.

Về cơ bản, mặc định đối với các loại tài liệu tham khảo luôn là null, và với nhiều loại giá trị (bao gồm struct) đó là mặc định (0 cho numerics, false cho bool, một struct với mọi lĩnh vực mặc định cho các cấu trúc, vv)

vì vậy, đối với một default(KeyValuePair<string, othertype>>) bạn muốn lấy lại một KVP nơi Keynull (mặc định cho string) và bất cứ default(othertype) sẽ (như trong ví dụ trên) ...

Từ số MSDN:

Thành phần đầu tiên phù hợp với các điều kiện được xác định bởi thuộc tính được chỉ định, nếu được tìm thấy; nếu không, giá trị mặc định cho loại T.

Sử dụng này, nếu bạn muốn kiểm tra và xem nếu bạn có lưng default, tôi muốn khuyên bạn nên kiểm tra yourResult.Key != null để xem nếu bạn có một kết quả, hoặc bạn có thể sử dụng phương thức Find khác như FindIndex như Olivier đề xuất.

+0

Có thể cần lưu ý rằng đối với loại giá trị cụ thể 'Nullable ', vì kết quả khởi tạo mặc định trong 'HasValue' là sai (như sẽ là bất kỳ Trường Boolean của bất kỳ cấu trúc nào), nó làm cho cấu trúc được diễn giải trong nhiều ngữ cảnh như một giá trị rỗng. – supercat

14

Lời khuyên của tôi là sử dụng FindIndex với nhiều loại phi nullable

int index = list.FindIndex(x => x.Key == "foobar"); 
if (index >= 0) { 
    // found! 
    UseResult(list[index]); 
} 

Giá trị mặc định default(T) được trả về nếu Find() không thành công. Đối với các kiểu không nullable, kết quả này không thể được phân biệt với các mục thông thường có giá trị mặc định. Điều này cũng đúng đối với các kiểu nullable khi danh sách có thể chứa các mục nhập null thông thường.

+1

+1: đây là giải pháp tốt hơn. Trong trường hợp này, một cặp khóa-giá trị có khóa null không thể là một giá trị hợp lệ, nhưng có thể. Quá nhiều người quên điều này, hoặc ví dụ, một 'Danh sách ' có thể chứa các giá trị null. – phoog

+1

+1: Rất đẹp. Tôi không muốn so sánh với một mặc định; như bạn đã nói, trong hầu hết các trường hợp, không có cách nào để xác định sự khác biệt. –

3

Cấu trúc là loại giá trị. Vì vậy, trong trường hợp của cấu trúc Tìm sẽ trả về giá trị mặc định của cấu trúc.

VÍ DỤ:

phép nói rằng chúng ta có cấu trúc như dưới đây,

public struct Test 
{ 
    public int i; 
} 

List<Test> list = new List<test>() { new Test { i = 1 } }; 
Test result = list.Find(o => o.i == 2); 

Trong giá trị kết quả Tìm trên như thử nghiệm mới(). bạn có thể so sánh giá trị bằng mã bên dưới.

if (resul.Equals(new Test())) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 

HOẶC

if (resul.Equals(default(Test))) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 
+0

Heh, rằng nếu điều kiện có vẻ như vậy ... sai. Điều đó sẽ không bao giờ làm việc cho các loại tài liệu tham khảo :) cấu trúc chắc chắn không phải cái gì tôi sử dụng hàng ngày mặc dù – Earlz

+0

Tôi đã thay đổi '==' thành Bằng. –

+0

Tôi khuyên bạn không nên thực hiện '== new Test()', điều đó hơi nặng vì '==' trên 'struct' là phản chiếu. Thay vào đó, tôi khuyên bạn nên kiểm tra trường 'Key' cho' null' trong ví dụ 'OP'. –

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