2016-05-13 80 views
1

我试图与LINQ一起加入两个列表,我正在努力。c#LINQ加入两个列表

我得到了什么?

类人:

class Person 
{ 
    public string Name { get; private set; } 
    public int Age { get; private set; } 
    public bool Parent { get; private set; } 
    public bool Child { get; private set; } 
    public int Housenumber { get; private set; } 

    public Person(string name, int age, bool parent, bool child, int housenumber) 
    { 
     Name = name; 
     Age = age; 
     Parent = parent; 
     Child = child; 
     Housenumber = housenumber; 
    } 
} 

类府:

class House 
{ 
    public int Housenumber { get; private set; } 
    public int Rooms { get; private set; } 
    public string Color { get; private set; } 

    public House(int housenumber, int rooms, string color) 
    { 
     Housenumber = housenumber; 
     Color = color; 
     Rooms = rooms; 
    } 
} 

人名单:

private static List<Person> people = new List<Person> 
    { 
     new Person("Joel", 12, false, true, 1), 
     new Person("jana", 22, false, false, 2), 
     new Person("Housi", 45, true, false, 3), 
     new Person("Kurt", 25, false, false, 4), 
     new Person("Sebastian", 65, true, false, 1), 
     new Person("George", 14, false, true, 2), 
     new Person("Noel", 50, true, false, 3) 
    }; 

和房屋列表:

private static List<House> houses = new List<House> 
    { 
     new House(1, 4, "blue"), 
     new House(2, 2, "red"), 
     new House(3, 3, "black"), 
     new House(4, 1, "violett") 
    }; 

我想创建一个包含'House'对象的新列表。 但只有那些至少有两个人居住的房子!

我被困在这里:

var houseWithMorePeople = from house in houses 
      join person in people 
       on house.Housenumber equals person.Housenumber 
      join person2 in people 
       on person.Housenumber equals person2.Housenumber 
      select house; 

回答

4

您可以简单地使用WhereCount这样的:

var result = houses 
    .Where(h => people.Count(p => p.Housenumber == h.Housenumber) >= 2) 
    .ToList(); 
3

没有必要为join。你可以用WhereCount做到这一点:

var houseWithMorePeople = houses.Where(house => 
    persons.Count(person => person.Housenumber == house.Housenumber) > 1); 

我不知道如何以最佳方式转换成Count()查询语言,所以这是我最好的猜测:

var houseWithMorePeople = 
     from house in houses 
     where (
       from person in persons 
       where person.Housenumber == house.Housenumber 
       select person 
     ).Count() > 1 
     select house; 

我喜欢的方法来调用。

2

在查询语法与GroupBy

IEnumerable<House> houseWithMorePeople = 
     from house in houses 
     join person in people 
      on house.Housenumber equals person.Housenumber 
     group house by house.Housenumber into multiResidentsHouse 
     where multiResidentsHouse.Count() >= 2 
     select multiResidentsHouse.First(); 

如果你想同时信息,房子和它的居民:

var houseIncludingResidents = 
    from house in houses 
    join person in people 
     on house.Housenumber equals person.Housenumber 
    let resident = new { house, person } 
    group resident by house.Housenumber into multiResidentsHouse 
    where multiResidentsHouse.Count() >= 2 
    select new 
    { 
     House = multiResidentsHouse.First().house, 
     Residents = multiResidentsHouse.Select(x => x.person).ToList() 
    }; 
+0

感谢您的查询,以获得它包括居民,这将是我的第二个目标 –

2

我真的答案惊讶说:“没有必要的加入,只是做无情的“。毕竟,更重要的是 - 以简短的方式做到这一点,或者以正确(更高性能)的方式做到这一点?

您正处在正确的轨道上。只是,而不是常规的join你需要一个group join,其作为Enumerable.GroupJoin文档中所述:

进行关联两个序列的基础上平等的关键要素,并对结果进行分组。

数据关联后,您可以对相关数据集执行高效的检查/聚合,例如计数,就像您的情况一样。

var houseWithMorePeople = 
    from house in houses 
    join person in people 
     on house.Housenumber equals person.Housenumber 
     into peopleInAHouse 
    where peopleInAHouse.Count() >= 2 
    select house;