我有兩個列表說更好的辦法
List<string> names; and List<Student> stud;
學生類有3個屬性
ID
Name
Section
現在我想通過List<string>
循環,每個項目與Name屬性List<Student>
比較並希望在不相等的情況下執行操作
我嘗試通過名稱進行循環,並將每個值與螺柱進行比較。
但我認爲必須有一些更好的方式來做到這一點LINQ
或我應該使用YIELD
。
感謝
我有兩個列表說更好的辦法
List<string> names; and List<Student> stud;
學生類有3個屬性
ID
Name
Section
現在我想通過List<string>
循環,每個項目與Name屬性List<Student>
比較並希望在不相等的情況下執行操作
我嘗試通過名稱進行循環,並將每個值與螺柱進行比較。
但我認爲必須有一些更好的方式來做到這一點LINQ
或我應該使用YIELD
。
感謝
這不是從你的描述很清楚,但如果你想「所有學生的名字不在名單」你絕對可以使用LINQ:
var studentsWithoutListedNames = stud.Where(s => !names.Contains(s.Name));
foreach (var student in studentsWithoutListedNames)
{
// Whatever...
}
他說如果我理解正確,他想「循環」不是學生的名字。除了(stud.Select(s => s.Name))' – Magnus 2013-05-14 13:47:24
@Magnus:可能。很難肯定地說。希望OP可以回過頭來說。 – 2013-05-14 14:11:17
的另一個好辦法這樣做將是:
var notOnList = students.Except(from student in students
join name in names on student.Name equals name
select student);
foreach(var student in notOnList)
{
...
}
對於「好」的相當深奧的定義... ... – RoadieRich 2013-05-14 13:52:55
其實它有比其他建議的解決方案更好的時間複雜性 – ghord 2013-05-14 15:26:01
它可能,但你犧牲可讀性,通常更重要的imo。 – RoadieRich 2013-05-14 15:37:40
如果你的意圖是不是喬恩描述,但更多的名稱列表中有學生姓名的列表進行比較,發現差異:
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);
}
應該寫瑪麗
他們是平行的列表? (如同樣,每個都有相同的數字) – Crisfole 2013-05-14 13:29:54
通常有助於包含迄今爲止您嘗試過的實際代碼,以便其他人可以改進它。 – 2013-05-14 13:31:05