1

我正在尝试在两个集合之间进行左连接。在图像中显示的结果中,我希望只看到一次 Anand。我究竟做错了什么

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqJoin
{
    internal class MainClass
    {
        public static void Main(string[] args)
        {
            var chessPlayers = new List<ChessPlayer>
                {
                    new ChessPlayer {FirstName = "Anand", Age = 51},
                    new ChessPlayer {FirstName = "Bobby", Age = 77},
                    new ChessPlayer {FirstName = "Kasprov", Age = 64}
                };

            var compScientists = new List<ComputerScientist>
                {
                    new ComputerScientist {FirstName = "Anand", Language = "C++"},
                    new ComputerScientist {FirstName = "Anand", Language = "C#"},
                    new ComputerScientist {FirstName = "Bobby", Language = "Java"},
                    new ComputerScientist {FirstName = "Steve", Language = "Ruby"},
                };


            var leftJoin =
                from ch in chessPlayers
                join cs in compScientists on ch.FirstName equals cs.FirstName
                    into chcs
                from cs in chcs.DefaultIfEmpty()
                select new {chessPlayer = ch, comp = chcs};

            foreach (var left in leftJoin)
            {
                Console.WriteLine("*********************");
                Console.WriteLine("{0} {1} ", left.chessPlayer.FirstName, left.chessPlayer.Age);
                foreach (ComputerScientist right in left.comp)
                {
                    Console.WriteLine("\t" + right.Language);
                }
            }
        }
    }


    internal class ChessPlayer
    {
        public string FirstName { get; set; }
        public int Age { get; set; }
    }

    internal class ComputerScientist
    {
        public string FirstName { get; set; }
        public string Language { get; set; }
    }
}

在此处输入图像描述

4

2 回答 2

2

您没有做错任何事情,如果连接条件与所讨论的每一行匹配,则左连接将返回多行。

考虑左连接的最佳方式是简单的内连接,其中不匹配的行在右表上返回空值。

我认为你想要的是不同的列表。在这种情况下,您需要更改

 foreach (var left in leftJoin)

foreach (var left in leftJoin.Distinct())
于 2013-10-16T18:55:55.540 回答
1

您显然想要 GroupJoin 而不是 LeftJoin。

var query =
  from ch in chessPlayers
  join cs in compScientists on ch.FirstName equals cs.FirstName
    into g
  select new {chessPlayer = ch, comp = g.ToList()};
于 2013-10-16T19:24:40.587 回答