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

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 al método de DefaultIfEmpty``1 en los resultados de una combinación agrupada.

Ejemplo

En el ejemplo siguiente se muestra cómo utilizar el método DefaultIfEmpty``1 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 de Person INNER- está unida a la lista de objetos de Pet basándose en un objeto de Person que coincida 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``1 en cada secuencia de elementos coincidentes de la combinación agrupada. En este ejemplo, DefaultIfEmpty``1 se llama en cada secuencia de objetos de Pet coincidentes. El método devuelve una colección que contiene un único, valor predeterminado si la secuencia de objetos de Pet coincidentes está vacía para cualquier objeto de Person, con lo que cada objeto de Person se representa en la colección de resultados.

NotaNota

El valor predeterminado para un tipo de referencia es null; por consiguiente, el ejemplo busca una referencia null antes de tener acceso a cada elemento de cada colección de 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 de ejemplo en el archivo program.cs, debajo del método de Main en la clase de Program. Agregue una línea de código al método de Main para llamar al método de LeftOuterJoinExample.

  • 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#)

Referencia

Join

GroupJoin

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

Conceptos

Operaciones de combinación

Tipos anónimos (Visual Basic)