【问题标题】:Better way for Comparing List in c#在 C# 中比较列表的更好方法
【发布时间】:2013-05-14 13:28:22
【问题描述】:

我有两个清单说

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

学生班有 3 个属性

ID
Name
Section

现在我想遍历List&lt;string&gt; 并将每个项目与List&lt;Student&gt; 中的 Name 属性进行比较,如果它们不相等则想要执行操作

我尝试遍历名称并将每个值与螺柱进行比较。

但我认为必须有更好的方法来使用LINQ 或者我应该使用YIELD

谢谢

【问题讨论】:

  • 他们是平行名单? (如,每个相同的数字?)

标签: c# list


【解决方案1】:

从您的描述中不是很清楚,但是如果您想要“所有姓名不在列表中的学生”,您绝对可以使用 LINQ:

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

【讨论】:

  • 他说如果我理解正确的话,他想“循环”名字而不是学生。 names.Except(stud.Select(s =&gt; s.Name))
  • @Magnus:可能。很难确定。希望 OP 会回来说任何一种方式。
【解决方案2】:

如果您的意图不是 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);
} 

应该写玛丽

【讨论】:

    【解决方案3】:

    另一个好方法是:

    var notOnList = students.Except(from student in students
                                    join name in names on student.Name equals name
                                    select student);
    foreach(var student in notOnList)
    {
       ...
    }
    

    【讨论】:

    • 实际上它比其他提议的解决方案具有更好的时间复杂度
    • 可能,但你牺牲了可读性,imo,这通常更重要。
    • 另外,你有一个 Linq 连接比 O(n*m) 更好的来源吗?
    • @RoadieRich Left join with null check 可能是最好的。或者如果先将names 放入HashSet,则为Jon 的解决方案。
    • @RoadieRich 只看一眼带有反射器的 Enumerable.GroupJoin 方法。它使用 GroupJoinIterator 反过来使用 Lookup 来提高效率
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多