Compartir a través de


Cómo: Realizar operaciones de combinación externa izquierda (Guía de programación de C#)

Actualización: noviembre 2007

Una combinación externa izquierda es una combinación en la que se devuelve un resultado para cada elemento de la primera colección, independientemente de si éste tiene elementos correlacionados en la segunda colección. Puede utilizar LINQ para realizar una combinación externa izquierda llamando a DefaultIfEmpty en los resultados de una combinación agrupada.

Ejemplo

En el ejemplo siguiente se muestra cómo utilizar el método DefaultIfEmpty en los resultados de una combinación agrupada para realizar una combinación externa izquierda.

El primer paso para generar una combinación externa izquierda de dos colecciones consiste en realizar una combinación interna utilizando una combinación agrupada. (Vea Cómo: Realizar combinaciones internas (Guía de programación de C#) para obtener una explicación de este proceso.) En este ejemplo, la lista de objetos Person se combina internamente con la lista de objetos Pet basándose en la coincidencia de un objeto Person con Pet.Owner.

El segundo paso consiste en incluir cada elemento de la primera colección (izquierda) en el conjunto de resultados, incluso cuando no haya coincidencias para el elemento en la colección derecha. Esto se realiza llamando a DefaultIfEmpty en cada secuencia de elementos coincidentes de la combinación agrupada. En este ejemplo se invoca a DefaultIfEmpty en cada secuencia de objetos Pet coincidentes. Devuelve una colección que contiene un valor único predeterminado si la secuencia de objetos Pet coincidentes está vacía para cualquier objeto Person, garantizando de este modo que cada objeto Person se representa en la colección de resultados.

Nota:

El valor predeterminado de un tipo de referencia es null; por lo tanto, el ejemplo busca una referencia null antes de tener acceso a cada uno de los elementos de cada colección Pet.

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

public static void LeftOuterJoinExample()
{
    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 };

    var query = from person in people
                join pet in pets on person equals pet.Owner into gj
                from subpet in gj.DefaultIfEmpty()
                select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };

    foreach (var v in query)
    {
        Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
    }
}

// This code produces the following output:
//
// Magnus:         Daisy
// Terry:          Barley
// Terry:          Boots
// Terry:          Blue Moon
// Charlotte:      Whiskers
// Arlene:

Compilar el código

  • Cree un nuevo proyecto de aplicación de consola en Visual Studio.

  • Agregue una referencia a System.Core.dll si ésta no existe aún.

  • Incluya el espacio de nombres System.Linq.

  • Copie el código del ejemplo y péguelo en el archivo program.cs, bajo el método Main. Agregue una línea de código al método Main para llamar al método que pegó.

  • Ejecute el programa.

Vea también

Tareas

Cómo: Realizar combinaciones internas (Guía de programación de C#)

Cómo: Realizar combinaciones agrupadas (Guía de programación de C#)

Conceptos

Operaciones de combinación

Tipos anónimos

Referencia

Join

GroupJoin

Tipos anónimos (Guía de programación de C#)