2016-05-13 56 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;