2013-05-14 88 views
6

我有兩個列表說更好的辦法

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

學生類有3個屬性

ID 
Name 
Section 

現在我想通過List<string>循環,每個項目與Name屬性List<Student>比較並希望在不相等的情況下執行操作

我嘗試通過名稱進行循環,並將每個值與螺柱進行比較。

但我認爲必須有一些更好的方式來做到這一點LINQ或我應該使用YIELD

感謝

+1

他們是平行的列表? (如同樣,每個都有相同的數字) – Crisfole 2013-05-14 13:29:54

+5

通常有助於包含迄今爲止您嘗試過的實際代碼,以便其他人可以改進它。 – 2013-05-14 13:31:05

回答

6

這不是從你的描述很清楚,但如果你想「所有學生的名字不在名單」你絕對可以使用LINQ:

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

他說如果我理解正確,他想「循環」不是學生的名字。除了(stud.Select(s => s.Name))' – Magnus 2013-05-14 13:47:24

+0

@Magnus:可能。很難肯定地說。希望OP可以回過頭來說。 – 2013-05-14 14:11:17

0

的另一個好辦法這樣做將是:

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

對於「好」的相當深奧的定義... ... – RoadieRich 2013-05-14 13:52:55

+1

其實它有比其他建議的解決方案更好的時間複雜性 – ghord 2013-05-14 15:26:01

+0

它可能,但你犧牲可讀性,通常更重要的imo。 – RoadieRich 2013-05-14 15:37:40

2

如果你的意圖是不是喬恩描述,但更多的名稱列表中有學生姓名的列表進行比較,發現差異:

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

例如:

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

應該寫瑪麗