2012-06-22 29 views
11

tôi có một danh sách của lớp này:Tạo danh sách với chỉ một thành viên lớp

public class Data 
{ 
    public string name {get; set;} 
    public int width {get; set;} 
} 

Và tôi muốn thực hiện một phương pháp mà trả về một danh sách các chỉ sở hữu tên. Như thế này:

public List<string> GetAllNames() 
{ return MyDataList<name>.ToList(); } 

Vì vậy, nếu tôi có danh sách này:

  1. name = Jon - width = 10
  2. name = Jack - width = 25

Tôi muốn danh sách sau:

  1. name = Jon
  2. name = Jack

Có thể?

Trả lời

21

Sử dụng LINQ:

public List<string> GetAllNames() 
{ 
    return MyDataList.Select(i => i.name).ToList(); 
} 
+1

LINQ đá! Cảm ơn. – Nick

+4

Như một lưu ý, nếu bạn trả về một Danh sách thì bạn sẽ về cơ bản sao chép toàn bộ danh sách. Điều này có thể mất thời gian/bộ nhớ nếu bạn có một danh sách lớn. Nếu bạn chuyển sang sử dụng IEnumerable và sau đó không làm các .ToList(), sau đó bạn sẽ nhận được một danh sách lười biếng đó là gần như miễn phí để tạo ra, và sẽ tiêu thụ rất ít (<100bytes) của không gian –

+2

@TimothyBaldridge: True. Nó cũng đáng chú ý là nếu bạn đi theo con đường 'IEnumerable', nó sẽ được đánh giá lại mỗi lần bạn lặp lại nó. IEnumerable của bạn cũng trở nên gắn với tập hợp các đối tượng ban đầu, vì vậy nó sẽ ngăn chặn bộ thu gom rác dọn dẹp tất cả các đối tượng 'Dữ liệu' ngay cả khi bạn chỉ định sử dụng tên từ chúng. Hơn nữa, nếu 'MyDataList' thay đổi,' IEnumerable' được trả về sẽ thay đổi và có thể ném một ngoại lệ nếu nó được sử dụng trong một chuỗi riêng biệt. Thường thì không có vấn đề gì trong số này quan trọng, nhưng nó luôn luôn là tốt để hiểu những gì đang xảy ra dưới sự bảo hiểm. – StriplingWarrior

2

Nếu bạn đang sử dụng .NET 3.5 (VS2008) hay muộn sau đó sử dụng phương pháp mở rộng:

public class Data { String Name; Int32 Width; } 
public List<Data> MyData = new List<Data>(); 

public static IEnumerable<String> GetNames(this List<Data> data) { 
    foreach(Data d in data) yield return d.Name; 
} 
// or use Linq to return a concrete List<String> implementation rather than IEnumerable. 
2
public List<string> GetAllNames() 
{ 
    return myDataList.Select(item => item.name).ToList(); 
} 
Các vấn đề liên quan