【问题标题】:Joining 2 lists with condition加入 2 个有条件的列表
【发布时间】:2017-09-29 08:49:57
【问题描述】:

我想加入 2 个列表。学生和个人。 Student 和 Person 都有 id 和 name 变量,而且 Student 有另一个名为 isStudying 的变量。我想通过 isStudying 变量将所有学生加入到 Person 中。

var persons = new Person { id = 1, name = "John" };
var persons = new Person { id = 2, name = "Ace" };
var persons = new Person { id = 3, name = "Mike" };
var persons = new Person { id = 4, name = "Yob" };
var persons = new Person { id = 5, name = "Ken" };

var students = new Student { id = 2, name = "Ace", isStudying=true };
var students = new Student { id = 3, name = "Mike", isStudying = true };
var students = new Student { id = 5, name = "Ken", isStudying = true };

persons.Addrange(students.where(student.id.contain(persons.id)));

【问题讨论】:

  • 1- 哪种语言? c# 也许 2- 使用继承 3- 正确声明变量
  • 感谢您的回答。 1. 是的,它是 C#。 2.数据来自不同的表。但仅选择这些值用于显示目的。 isStudying 变量将确定复选框是否在显示时被选中。
  • 如果您可以使用匿名类型,这里有一条:persons.Select(p => new { p.id, p.name, students.Any(s => s.id == p.id && s.isStudying) });。虽然看起来你也可以使用 Student 类:persons.Select(p => new Student { id = p.id, name = p.name, isStudying = students.Any(s => s.id == p.id && s.isStudying) });
  • 谢谢!这解决了我的问题。谢谢@KeyurPATEL

标签: list linq join addrange


【解决方案1】:

这是在 linq 中实现的完整解决方案,使用继承

class Person
{
    public int id { get; set; }
    public string name { get; set; }
}

class Student : Person
{
    public bool isStudying { get; set; }
}

void Main()
{
    var person1 = new Person { id = 1, name = "John" };
    var person2 = new Person { id = 2, name = "Ace" };
    var person3 = new Person { id = 3, name = "Mike" };
    var person4 = new Person { id = 4, name = "Yob" };
    var person5 = new Person { id = 5, name = "Ken" };

    var persons = new List<Person> { person1, person2, person3, person4, person5 };

    var student1 = new Student { id = 2, name = "Ace", isStudying = true };
    var student2 = new Student { id = 3, name = "Mike", isStudying = true };
    var student3 = new Student { id = 5, name = "Ken", isStudying = true };

    var students = new List<Student> { student1, student2, student3 };

    var personsRes = persons.Where(y => students.Select(x => x.id).Contains(y.id));

    Console.WriteLine(personsRes);
}

【讨论】:

    【解决方案2】:

    试试这个:

     public class Person
        {
            public int id { get; set; }
            public string name { get; set; }
        }
    
        public class Student
        {
            public int id { get; set; }
            public string name { get; set; }
            public bool isStudying { get; set; }
        }
    
        var persons = new List<Person> { new Person { id = 1, name = "John" },
             new Person { id = 2, name = "Ace" },
             new Person { id = 3, name = "Mike"},
             new Person { id = 4, name = "Yob" },
             new Person { id = 5, name = "Ken" } };
    
            var students = new List<Student> { new Student { id = 2, name = "Ace", isStudying = true },
            new Student { id = 3, name = "Mike", isStudying = true },
            new Student { id = 5, name = "Ken", isStudying = true } };
    
            var allPersons = (from p in persons
                              join s in students on new { first = p.id } equals new { first = s.id } into sjoin
                              from slj in sjoin.DefaultIfEmpty()
                              select new
                              {
                                  id = p.id,
                                  name = p.name,
                                  isStudying = (slj != null ? (slj.isStudying ? "TRUE" : "FALSE") : string.Empty)
                              }).ToList();
    

    【讨论】:

      【解决方案3】:

      为了将来的读者参考,我在 cmets 中使用 LINQ 提供的一个简单答案是:

      使用匿名类型:

      persons.Select(p => new { p.id, p.name, students.Any(s => s.id == p.id && s.isStudying) });
      

      使用自定义类(Student 类实际上可以重复使用):

      persons.Select(p => new Student { id = p.id, name = p.name, isStudying = students.Any(s => s.id == p.id && s.isStudying) });
      

      【讨论】:

        猜你喜欢
        • 2017-04-17
        • 2013-10-03
        • 1970-01-01
        • 2021-11-27
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多