2013-05-14 18 views
6

mam dwa lista powiedziećLepsza droga do porównywania Lista wC#

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

Klasa Student posiada 3 właściwości

ID 
Name 
Section 

Teraz chcę pętli List<string> i porównać każdą pozycję z właściwości Name w List<Student> i chcesz wykonać operacje, jeśli nie są one równe. Próbowałem zapętlać nazwy i porównywać każdą z wartości do stadniny.

Ale myślałem, że musi być jakiś lepszy sposób robienia tego z LINQ lub powinienem używać YIELD.

Dzięki

+1

Są wykazy równoległe? (Jak w tej samej liczbie w każdym?) – Crisfole

+5

Zwykle pomaga dołączyć rzeczywisty kod, który wypróbowałeś do tej pory, aby inni mogli go ulepszyć. –

Odpowiedz

6

To nie jest bardzo jasne, z opisu, ale jeśli chcesz „wszystkich studentów, których nazwiska nie znajdują się na liście” na pewno można używać LINQ:

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

Mówi, że chce "zapętlić" imiona, a nie studentów, jeśli rozumiem to poprawnie. 'names.Except (stud.Select (s => s.Name))' – Magnus

+0

@Magnus: Possibly. Trudno powiedzieć na pewno. Mam nadzieję, że PO powróci, by powiedzieć w obu kierunkach. –

0

Innym dobrym sposobem robi to byłoby:

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

Dla raczej ezoterycznej definicji "dobra" ... – RoadieRich

+1

W rzeczywistości ma lepszą złożoność czasu niż inne proponowane rozwiązanie. – ghord

+0

Może, ale rezygnujesz z czytelności, imo, co jest zazwyczaj ważniejsze. – RoadieRich

2

Jeśli intencją nie jest to, co opisuje Jon ale bardziej porównać listę nazwisk z listy nazwisk studentów i znajdź różnice:

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

na przykład:

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); 
} 

powinien napisać Mary