C# 通过3个属性查找与其他列表元素类似的列表元素,然后将第二个元素的值添加到第一个元素 protectedvoid AddPositionForPlayers(列出玩家、, 列表播放位置) { foreach(玩家中的玩家) { foreach(玩家位置中的玩家角色) { 如果(player.FirstName==playerPos.FirstName&& player.LastName==playerPos.FirstName&& player.TeamName==playerPos.TeamName) { player.Position=playerPos.Position; } } } }
如何将此函数更改为LINQ?或者这是不应该用LINQ做的事情之一?因为我找不到类似于这个问题的东西。我看不出它有什么好处,但您可以使用C# 通过3个属性查找与其他列表元素类似的列表元素,然后将第二个元素的值添加到第一个元素 protectedvoid AddPositionForPlayers(列出玩家、, 列表播放位置) { foreach(玩家中的玩家) { foreach(玩家位置中的玩家角色) { 如果(player.FirstName==playerPos.FirstName&& player.LastName==playerPos.FirstName&& player.TeamName==playerPos.TeamName) { player.Position=playerPos.Position; } } } },c#,list,linq,object,C#,List,Linq,Object,如何将此函数更改为LINQ?或者这是不应该用LINQ做的事情之一?因为我找不到类似于这个问题的东西。我看不出它有什么好处,但您可以使用List.ForEach与FirstOrDefault和null条件运算符组合使用: protected void AddPositionForPlayers(List<Player> players, List<Player> playerPosition) {
List.ForEach
与FirstOrDefault
和null条件运算符组合使用:
protected void AddPositionForPlayers(List<Player> players,
List<Player> playerPosition)
{
foreach (Player player in players)
{
foreach (Player playerPos in playerPosition)
{
if (player.FirstName == playerPos.FirstName &&
player.LastName == playerPos.FirstName &&
player.TeamName == playerPos.TeamName)
{
player.Position = playerPos.Position;
}
}
}
}
对于LINQ,解决方案也会有所不同(仅供参考,我不建议使用此代码):
您可以连接它们并循环连接的结果以更新列表:
players
.Where((p, i) =>
{
Player pp = playerPosition[i];
bool result = p.FirstName == pp.FirstName && p.LastName == pp.LastName && p.TeamName == pp.TeamName;
if (result)
{
p.Position = pp.Position;
}
return result;
}).ToList(); // note that this will create a copy of players List
如果列表长度相等,并且在3个匹配属性时希望将第二个列表元素的值添加到第一个列表元素,则以下代码将实现此目的:
var joined = players.Join(
playerPosition,
p => new {p.FirstName, p.LastName, p.TeamName},
p => new {p.FirstName, p.LastName, p.TeamName},
(player, playerPos) => new {player, playerPos});
foreach (var pair in joined) pair.player.Position = pair.playerPos.Position;
List players=players.Zip(playerPosition,(player,playerPosition)=>(
如果(player.FirstName==playerPos.FirstName&&
player.LastName==playerPos.FirstName&&
player.TeamName==playerPos.TeamName){
player.Position=playerPos.Position;
}
));
您的代码看起来很奇怪,因为如果playerPosition
中有多个元素与3个属性匹配,然后player.position
元素将被设置为playerPosition
中的最后一个匹配元素,您希望从这里使用LINQ获得什么好处?您是否尝试从第二个位置添加每个位置(即+=
)或者只是将第二个职位分配给第一个?大学项目要求之一就是尽可能多地使用LINQ。所以我改变了排序算法,最有价值的玩家选择,现在考虑这个函数,或者它是可能的,值得改变它。KMoussa,只需将第二个的位置分配给第一个。
players
.Where((p, i) =>
{
Player pp = playerPosition[i];
bool result = p.FirstName == pp.FirstName && p.LastName == pp.LastName && p.TeamName == pp.TeamName;
if (result)
{
p.Position = pp.Position;
}
return result;
}).ToList(); // note that this will create a copy of players List
var joined = players.Join(
playerPosition,
p => new {p.FirstName, p.LastName, p.TeamName},
p => new {p.FirstName, p.LastName, p.TeamName},
(player, playerPos) => new {player, playerPos});
foreach (var pair in joined) pair.player.Position = pair.playerPos.Position;
List<Player> players = players.Zip(playerPosition, (player, playerPosition) => (
if (player.FirstName == playerPos.FirstName &&
player.LastName == playerPos.FirstName &&
player.TeamName == playerPos.TeamName) {
player.Position = playerPos.Position;
}
));