C# Linq左连接,左集合项在结果中重复
我正在尝试在两个集合之间进行左连接。在图中显示的结果中,我只希望看到Anand一次。我做错了什么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
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()};