2011-09-27 28 views
5

tôi có một thực thể gọi là sản phẩmChuyển đổi IEnumerable <T> để string []

class Product 
{ 
    public Id { get; set; } 
    public Name { get; set; } 
} 

và tôi có một danh sách của tất cả các sản phẩm:

IEnumerable<Product> products = _productRepository.GetAll() 

tôi muốn có được một mảng các chuỗi từ danh sách này của các sản phẩm mảng này sẽ chứa Id sản phẩm + Tên sản phẩm, vì vậy khi tôi cố gắng truyền sản phẩm bằng mã sau:

string[] s = products.Cast<string>().ToArray(); 

tôi đã nhận ngoại lệ sau đây:

Unable to cast object of type 'Product' to type 'System.String' 

ngoại trừ thực sự làm cho rất nhiều fo Scence, vì vậy nếu tôi đã có một phương pháp

string ProductToString(Product p) 
{ 
    return p.Name; 
} 

hoặc ghi đè để ToString() cho đối tượng sản phẩm để làm thế nào tôi có thể sử dụng phương pháp này để lấy danh sách chuỗi [] từ IEnumerable?

Trả lời

20

Vâng, cho rằng phương pháp mà bạn có thể sử dụng :

string[] s = products.Select<string>(ProductToString).ToArray(); 

Tuy nhiên, nó sẽ là thành ngữ hơn làm điều này mà không cần một phương pháp riêng biệt, thường là sử dụng biểu thức lambda:

// Matches ProductToString, but not your description 
string[] s = products.Select(p => p.Name).ToArray(); 

Tôi chỉ sử dụng một phương pháp riêng biệt nếu nó được gọi từ nhiều nơi khác nhau (đảm bảo tính nhất quán) hoặc đã thực hiện rất nhiều công việc.

EDIT: Tôi vừa nhận thấy rằng mô tả (muốn ID + tên) của bạn không thực sự khớp với phương pháp ProductToString mà bạn đã cung cấp (chỉ cung cấp tên). Đối với tên + ID Tôi muốn sử dụng:

string[] s = products.Select(p => p.ID + " " + p.Name).ToArray(); 

hoặc

string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name)) 
        .ToArray(); 

Hoặc bạn chỉ có thể thay đổi phương thức ProductToString của bạn, tất nhiên.

Ngoài ra, bạn có thể ghi đè lên ToString() trong Product, nếu đây là thường cách bạn muốn chuyển đổi một Product đến một string. Sau đó, bạn có thể sử dụng chuyển đổi nhóm phương pháp hoặc biểu thức lambda để gọi ToString.


Có thể là bạn không cần phải xác định đối số kiểu một cách rõ ràng - rằng:

string[] s = products.Select(ProductToString).ToArray(); 

sẽ làm việc tốt - các quy tắc cho loại suy luận và nhóm phương pháp chuyển đổi luôn luôn nhầm lẫn tôi và hành vi của trình biên dịch đã thay đổi một chút theo thời gian. Một thử nghiệm nhanh ngay bây giờ có vẻ như nó hiện hoạt động, nhưng có thể có sự tinh tế trong hơi các tình huống khác nhau.

+0

IMHO bạn không phải viết xuống ' 'trong đó và tất nhiên bạn đánh tôi bằng 30secs .... – Carsten

+0

@ CarstenKönig: Nó có thể * * phụ thuộc vào phiên bản của trình biên dịch bạn đang sử dụng. Có những thay đổi tinh tế trong trình biên dịch v4, IIRC. Tôi đã thêm một lưu ý về điều đó xung quanh thời gian bạn đã bình luận :) –

2
string[] s = products.Select(p => p.Name).ToArray(); 

Hoặc, nếu bạn cần Id + Tên:

string[] s = products.Select(p => p.Id + ' ' + p.Name).ToArray(); 
1

sử dụng

string[] s = (from p in products select p.Id.ToString() + " " + p.Name.ToString()).ToArray(); 
Các vấn đề liên quan