C# 通过3个属性查找与其他列表元素类似的列表元素,然后将第二个元素的值添加到第一个元素 protectedvoid AddPositionForPlayers(列出玩家、, 列表播放位置) { foreach(玩家中的玩家) { foreach(玩家位置中的玩家角色) { 如果(player.FirstName==playerPos.FirstName&& player.LastName==playerPos.FirstName&& player.TeamName==playerPos.TeamName) { player.Position=playerPos.Position; } } } }

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) {

如何将此函数更改为LINQ?或者这是不应该用LINQ做的事情之一?因为我找不到类似于这个问题的东西。

我看不出它有什么好处,但您可以使用
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;
        }

));