2012-04-21 49 views
103

Trong C#, giả sử tôi có một lớp được gọi là Chú ý với ba biến thành viên Chuỗi.Lấy danh sách các giá trị khác nhau trong Danh sách

public class Note 
{ 
    public string Title; 
    public string Author; 
    public string Text; 
} 

Và tôi có một danh sách các loại Lưu ý:

List<Note> Notes = new List<Note>(); 

Điều gì sẽ là cách sạch để có được một danh sách của tất cả các giá trị khác biệt trong các Tác giả cột?

Tôi có thể lặp qua danh sách và thêm tất cả các giá trị không trùng lặp với danh sách chuỗi khác, nhưng điều này có vẻ bẩn và không hiệu quả. Tôi có một cảm giác có một số công trình Linq huyền diệu sẽ làm điều này trong một dòng, nhưng tôi đã không thể tìm ra bất cứ thứ gì.

Trả lời

209
Notes.Select(x => x.Author).Distinct(); 

này sẽ trả về một chuỗi (IEnumerable<string>) của Author giá trị - một cho mỗi giá trị duy nhất.

+0

Ghi chú.Select (x => x.Author) .AsParallel(). Khác biệt(); "AsParallel()" có thể cung cấp một số lợi ích hiệu suất, nếu chúng ta không quan tâm đến trật tự và có nhiều mặt hàng trong danh sách. – Sai

+1

@Kiquenet, khác biệt so với trình so sánh bình đẳng 'Mặc định'. https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx –

+0

Chúng ta có cần thêm ToList() trước .Distinct()? –

24

Jon Skeet đã viết một thư viện có tên là morelinq có nhà điều hành DistinctBy(). Xem here để triển khai. Mã của bạn sẽ trông như thế

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author); 

Cập nhật: Sau khi đọc câu hỏi của bạn, Kirk có câu trả lời chính xác nếu bạn chỉ cần tìm kiếm một bộ riêng biệt của tác giả.

Added mẫu, một số lĩnh vực trong DistinctBy:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList(); 
+0

https://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs Lỗi 404 – Kiquenet

+0

Liên kết đến nguồn DistinctBy đã được cập nhật. –

+0

Tuyệt vời, cảm ơn bạn. Tôi thích nó giữ đúng thứ tự nếu tôi đặt hàng trước khi tôi gọi phương thức Distinct. – Vilhelm

-1
mcilist = (from mci in mcilist select mci).Distinct().ToList(); 
+0

Chính xác thì mci là gì? Chỉ là một bảng ví dụ? Câu trả lời hơi khó xử. –

+0

Vâng, tôi không nghĩ rằng điều này làm những gì câu hỏi ban đầu của tôi đã được tìm kiếm (không bao giờ nhớ nó là một năm rưỡi trước và dự án là dài kể từ khi hoàn thành). Từ những gì tôi có thể nói, điều này sẽ hoạt động nếu tôi đã có danh sách các chuỗi Tác giả có thể chứa các bản sao, nhưng không thể được sử dụng để trích xuất danh sách đó từ danh sách các đối tượng có chuỗi Tác giả làm một trong các trường của chúng. –

40
var DistinctItems = employees.GroupBy(x => x.EmpID).Select(y => y.First()); 

foreach(var item in DistinctItems) 
{ 
    //Add to other List 
} 
0
public class KeyNote 
    { 
     public long KeyNoteId { get; set; } 
     public long CourseId { get; set; } 
     public string CourseName { get; set; } 
     public string Note { get; set; } 
     public DateTime CreatedDate { get; set; } 
    } 

public List<KeyNote> KeyNotes { get; set; } 
public List<RefCourse> GetCourses { get; set; } 


List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList(); 

Bằng cách sử dụng trên Logic chúng ta có thể khóa học độc đáo.

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