2009-01-29 29 views
9

Tôi rất thích âm thanh của ElementAtOrDefaultOperator này để sử dụng với danh sách chung, nhưng tôi không biết cách xác định loại mặc định cho danh sách đối tượng của mình. Từ những gì tôi hiểu, defaultvalue sẽ là null nếu tôi có một danh sách các đối tượng như dưới đây, nhưng tôi muốn trả về phiên bản của riêng tôi về một đối tượng mặc định với các giá trị thích hợp. Dưới đây là những gì tôi có nghĩa là:LINQ Cách xác định kiểu mặc định để sử dụng với Toán tử ElementAtOrDefault

ClassA { 

string fieldA; 
string fieldB; 
ClassB fieldC; 

//constructor 

} 

List<ClassA> myObjects = new List<ClassA>(); 

myObjects.Add(//new object) 
myObjects.Add(//new object) 

Vì vậy, tôi muốn để có thể làm như sau:

ClassA newObject = myObjects.ElementAtOrDefault(3); 

Và có newObject là một loại mặc định của ClassA mà tôi xác định nơi nào đó. Tôi nghĩ rằng có thể có một SetDefaultElement hoặc một số phương pháp khác nhưng tôi không nghĩ rằng nó tồn tại.

Mọi suy nghĩ?

Trả lời

18

Chỉ cần viết phương pháp khuyến nông của riêng bạn:

static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default; 
} 

và gọi:

var item = myObjects.ElementAtOrDefault(3, defaultItem); 

Hoặc nếu bạn muốn mặc định được đánh giá một cách lười biếng, sử dụng một Func<T> cho mặc định:

static T ElementAtOrDefault<T>(this IList<T> list, int index, 
    Func<T> @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default(); 
} 

Biểu mẫu này, ví dụ: sẽ cho phép bạn sử dụng một mục được xác định trước (ví dụ đầu tiên):

var item = myObjects.ElementAtOrDefault(3, myObjects.First); 

hoặc linh hoạt hơn:

var item = myObjects.ElementAtOrDefault(3,() => myObjects[2]); 

hoặc

var item = myObjects.ElementAtOrDefault(3,() => new MyObject {...}); 
+0

Một quá tải thích hợp có thể trở lại mặc định (T) như trong việc thực hiện LINQ. – user7116

+1

@sixlettervariables - nhưng điều đó đã tồn tại trong toán tử LINQ không quá tải, tiêu chuẩn ... –

+0

Thực sự tự hỏi tại sao nó không phải là một phần của khung công tác. Đó là tầm thường nhưng tôi không muốn thêm các lớp mở rộng cho các dự án thừa kế chỉ vì sự quá tải này. –

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