C# 在c中比较列表的更好方法#
我有两张单子要说C# 在c中比较列表的更好方法#,c#,list,C#,List,我有两张单子要说 List<string> names; and List<Student> stud; 现在我想循环查看列表,并将每个项与列表中的Name属性进行比较,如果它们不相等,我想执行操作 我试着通过名称循环并将每个值与螺柱进行比较 但是我想一定有更好的方法来使用LINQ或者我应该使用YIELD 谢谢从您的描述中不太清楚,但是如果您想要“名单上没有名字的所有学生”,您绝对可以使用LINQ: var studentsWithoutListedNames = st
List<string> names; and List<Student> stud;
现在我想循环查看列表
,并将每个项与列表
中的Name属性进行比较,如果它们不相等,我想执行操作
我试着通过名称循环并将每个值与螺柱进行比较
但是我想一定有更好的方法来使用LINQ
或者我应该使用YIELD
谢谢从您的描述中不太清楚,但是如果您想要“名单上没有名字的所有学生”,您绝对可以使用LINQ:
var studentsWithoutListedNames = stud.Where(s => !names.Contains(s.Name));
foreach (var student in studentsWithoutListedNames)
{
// Whatever...
}
另一个好方法是:
var notOnList = students.Except(from student in students
join name in names on student.Name equals name
select student);
foreach(var student in notOnList)
{
...
}
如果您的目的不是Jon所描述的,而是比较姓名列表和学生姓名列表,找出差异:
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);
}
应该给玛丽写信吗它们是平行列表?(如中所示,每个数字相同?)他说,如果我理解正确,他想“循环”这些名字,而不是学生<代码>名称。除了(stud.Select(s=>s.Name))@Magnus:可能。很难说清楚。希望OP会回来说这两种方式。实际上,它比其他建议的解决方案具有更好的时间复杂度,但您牺牲了可读性,imo,这通常更重要。此外,您是否有Linq连接优于O(n*m)的来源?@RoadieRich Left join和null check可能是最好的。或者,如果先将
名称
放入哈希集
,则使用Jon的解决方案。@RoadieRich只需浏览一下Enumerable.GroupJoin方法和reflector。它使用GroupJoinIterator,后者反过来使用查找来提高效率
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);
}