Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq左连接,左集合项在结果中重复_C#_Linq - Fatal编程技术网

C# Linq左连接,左集合项在结果中重复

C# Linq左连接,左集合项在结果中重复,c#,linq,C#,Linq,我正在尝试在两个集合之间进行左连接。在图中显示的结果中,我只希望看到Anand一次。我做错了什么 using System; using System.Collections.Generic; using System.Linq; namespace LinqJoin { internal class MainClass { public static void Main(string[] args) { var ches

我正在尝试在两个集合之间进行左连接。在图中显示的结果中,我只希望看到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; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间LinqJoin
{
内部类main类
{
公共静态void Main(字符串[]args)
{
var chessPlayers=新列表
{
新棋手{FirstName=“Anand”,年龄=51},
新棋手{FirstName=“Bobby”,年龄=77},
新棋手{FirstName=“Kasprov”,年龄=64}
};
var=新列表
{
新计算机科学家{FirstName=“Anand”,Language=“C++”},
新计算机科学家{FirstName=“Anand”,Language=“C#”},
新计算机科学家{FirstName=“Bobby”,Language=“Java”},
新计算机科学家{FirstName=“Steve”,Language=“Ruby”},
};
变量leftJoin=
来自中国棋手
在C.FirstName上加入cs。C.FirstName等于cs.FirstName
进入CHC
从chcs.DefaultIfEmpty()中的cs
选择新的{chessPlayer=ch,comp=chcs};
foreach(leftJoin中的变量left)
{
Console.WriteLine(“*************************”);
Console.WriteLine(“{0}{1}”,left.chessPlayer.FirstName,left.chessPlayer.Age);
foreach(计算机科学家左中右comp)
{
Console.WriteLine(“\t”+right.Language);
}
}
}
}
内部类棋手
{
公共字符串名{get;set;}
公共整数{get;set;}
}
内部类计算机科学家
{
公共字符串名{get;set;}
公共字符串语言{get;set;}
}
}

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

考虑左连接的最佳方式是简单地使用内部连接,该内部连接的非匹配行在右表上返回空值

我认为你想从中得到的是一份明确的清单。在这种情况下,您需要进行更改

 foreach (var left in leftJoin)


显然,您希望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()};

g.ToList上的ToList()不是necessary@Foo是的。然而,这就是我在我的商店里编码的方式。在一天结束时,列表在结果中比iGroup更方便。
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()};