Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中比较列表的更好方法#_C#_List - Fatal编程技术网

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