加入2个条件列表

时间:2017-09-29 08:49:58

标签: list linq join addrange

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

enter image description here

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

对于未来的读者&#39;参考,我在使用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) });