Jak: wykonywanie zgrupowane sprzężenia (C# Programming Guide)
Sprzężenie grupy jest przydatne dla produkujących struktury hierarchicznej danych.Każdy element z kolekcji pierwszy zestaw elementów skorelowane z drugiego zbioru go pary.
Na przykład klasa lub tabela relacyjnej bazy danych o nazwie Student może zawierać dwa pola: identyfikator i nazwę.Tabela drugiej klasy lub relacyjnej bazy danych o nazwie kurs może zawierać dwa pola: StudentId i CourseTitle.Sprzężenie grupy tych dwóch danych źródeł, na podstawie dopasowania Student.Id i Course.StudentId, czy grupa Każdy Student z kolekcji obiektów kursu (które mogą być puste).
[!UWAGA]
Każdy element kolekcji pierwszy pojawia się w zestawie wyników sprzężenia grupy, niezależnie od tego, czy elementy ze sobą skorelowanych znajdują się w drugiej kolekcji.W przypadku gdy znajdują się nie elementy ze sobą skorelowanych sekwencja elementów skorelowanych dla tego elementu jest pusta.Selektor wynik ma więc dostęp do każdego elementu pierwszy zbiór.To różni się od selektor wynik w sprzężeniu-grupa nie może uzyskać dostępu do elementów z kolekcji pierwszego, które mają nie dopasowania w drugiej kolekcji.
Pierwszy przykład, w tym temacie przedstawiono sposób wykonywania sprzężenia grupy.Drugi przykład przedstawia, jak używać sprzężenia grupy do tworzenia elementów XML.
Przykład
Przykład sprzężenia grupy
W następującym przykładzie wykonywana sprzężenia grupy obiektów typu Person i Pet na podstawie Person pasujące Pet.Owner właściwości.W przeciwieństwie do sprzężenia-grupa przyniosłoby para elementów dla każdego dopasowania, sprzężenia grupy tworzy tylko jeden obiekt wynikowy dla każdego elementu pierwsza kolekcja, która w tym przykładzie jest Person obiektu.Odpowiednie elementy z drugiego zbioru, które są w tym przykładzie Pet obiektów, są pogrupowane w kolekcji.Wreszcie, wynik funkcji selektor tworzy typ anonimowy dla każdego dopasowania, która składa się z Person.FirstName i Kolekcja Pet obiektów.
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
/// <summary>
/// This example performs a grouped join.
/// </summary>
public static void GroupJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };
// Create a list where each element is an anonymous type
// that contains the person's first name and a collection of
// pets that are owned by them.
var query = from person in people
join pet in pets on person equals pet.Owner into gj
select new { OwnerName = person.FirstName, Pets = gj };
foreach (var v in query)
{
// Output the owner's name.
Console.WriteLine("{0}:", v.OwnerName);
// Output each of the owner's pet's names.
foreach (Pet pet in v.Pets)
Console.WriteLine(" {0}", pet.Name);
}
}
// This code produces the following output:
//
// Magnus:
// Daisy
// Terry:
// Barley
// Boots
// Blue Moon
// Charlotte:
// Whiskers
// Arlene:
Sprzężenie grupy, aby utworzyć przykładowym kodzie XML
Grupy sprzężenia są idealnym rozwiązaniem dla tworzenia XML przy użyciu LINQ to XML.Poniższy przykład jest podobny do poprzedniego przykładu, z wyjątkiem, że zamiast tworzenia typy anonimowe, wynik funkcji selektor tworzy elementy XML, które reprezentują obiekty połączone.Aby uzyskać więcej informacji o LINQ to XML, zobacz LINQ to XML.
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
/// <summary>
/// This example creates XML output from a grouped join.
/// </summary>
public static void GroupJoinXMLExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };
// Create XML to display the hierarchical organization of people and their pets.
XElement ownersAndPets = new XElement("PetOwners",
from person in people
join pet in pets on person equals pet.Owner into gj
select new XElement("Person",
new XAttribute("FirstName", person.FirstName),
new XAttribute("LastName", person.LastName),
from subpet in gj
select new XElement("Pet", subpet.Name)));
Console.WriteLine(ownersAndPets);
}
// This code produces the following output:
//
// <PetOwners>
// <Person FirstName="Magnus" LastName="Hedlund">
// <Pet>Daisy</Pet>
// </Person>
// <Person FirstName="Terry" LastName="Adams">
// <Pet>Barley</Pet>
// <Pet>Boots</Pet>
// <Pet>Blue Moon</Pet>
// </Person>
// <Person FirstName="Charlotte" LastName="Weiss">
// <Pet>Whiskers</Pet>
// </Person>
// <Person FirstName="Arlene" LastName="Huff" />
// </PetOwners>
Kompilowanie kodu
Utwórz nowy Console Application projektu w Visual Studio.
Dodaj odwołanie do System.Core.dll i System.Xml.Linq.dll nie są już odwołania.
Zawiera System.Linq i System.Xml.Linq obszarów nazw.
Skopiuj i Wklej kod z przykładu do pliku plik program.cs poniżej Main metody.Dodawanie linii kodu do Main metodę w celu wywołania metody wklejane w.
Uruchom program.
Zobacz też
Zadania
Jak: wykonywanie sprzężenia wewnętrzne (C# Programming Guide)
Jak: wykonywać lewym sprzężenia zewnętrzne (Podręcznik programowania C#)
Informacje
Typy anonimowe (Podręcznik programowania C#)