2013-05-14 45 views
6

Tôi có hai danh sách nóicách tốt hơn cho So sánh Danh sách trong C#

List<string> names; and List<Student> stud; 

Sinh viên lớp có 3 thuộc tính

ID 
Name 
Section 

Bây giờ tôi muốn lặp qua List<string> và so sánh từng mục với tài sản Tên trong List<Student> và muốn thực hiện các hoạt động nếu chúng không bằng nhau

Tôi đã thử lặp qua tên và so sánh từng giá trị để đánh dấu.

Nhưng tôi nghĩ rằng phải có một số cách tốt hơn để làm điều này với LINQ hoặc tôi nên sử dụng YIELD.

Cảm ơn

+1

Họ liệt kê song song? (Giống như, cùng một số trong mỗi?) – Crisfole

+5

Thường giúp bao gồm mã thực tế bạn đã thử cho đến nay, vì vậy những người khác có thể cải thiện nó. –

Trả lời

6

Đó là không phải là rất rõ ràng từ mô tả của bạn, nhưng nếu bạn muốn "tất cả các sinh viên có tên không có trong danh sách" bạn chắc chắn có thể sử dụng LINQ:

var studentsWithoutListedNames = stud.Where(s => !names.Contains(s.Name)); 
foreach (var student in studentsWithoutListedNames) 
{ 
    // Whatever... 
} 
+0

Ông nói rằng ông muốn "vòng" các tên không phải là sinh viên nếu tôi hiểu nó một cách chính xác. 'names.Except (stud.Select (s => s.Name))' – Magnus

+0

@Magnus: Có thể. Thật khó để nói chắc chắn. Hy vọng rằng OP sẽ trở lại để nói một trong hai cách. –

0

Một cách tốt để làm điều này sẽ là:

var notOnList = students.Except(from student in students 
           join name in names on student.Name equals name 
           select student); 
foreach(var student in notOnList) 
{ 
    ... 
} 
+1

Đối với một định nghĩa khá bí truyền về "tốt" ... – RoadieRich

+1

Thực ra nó có độ phức tạp tốt hơn so với giải pháp đề xuất khác – ghord

+0

Nó có thể, nhưng bạn đang hy sinh khả năng đọc, imo, thường là quan trọng hơn. – RoadieRich

2

Nếu ý định của bạn không phải là điều Jon mô tả mà còn nhiều hơn để so sánh danh sách tên với tên sinh viên và tìm sự khác biệt:

var invalidStudents = names.Zip(stud, (name, student) => new {name, student}). 
          Where(item => (item.name != item.student.Name)); 
if (invalidStudents.Any()) // Or foreach... 
{ 
    ... 
} 

ví dụ:

var names = new string[] { "John", "Mary" }; 
var stud = new Student[] { new Student(1, "John", "IT"), new Student(2, "Jack", "Math") }; 
var invalidStudents = names.Zip(stud, (name, student) => new {name, student}). 
          Where(item => (item.name != item.student.Name)); 
foreach (var item in invalidStudents) 
{ 
    Console.WriteLine(item.name); 
} 

nên viết Mary

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