确定ID是否存在于类列表中

本文关键字:列表 于类 存在 ID 是否 确定 | 更新日期: 2023-09-27 18:17:15

我试图确定球员是否已经存在于球员列表中,如果他们这样做,我想更新他们的数据,但是如果他们不在那里,我要添加他们。我遇到的问题是,对象被设置为selectedPlayer,因此它不是空的,它覆盖旧的记录,而不是添加一个新的。

var obj = Variables.players.FirstOrDefault(player => player.MembershipID  == selectedPlayer.MembershipID);
if (obj != null)
{
    obj = selectedPlayer;
}
else
{
    Variables.players.Add(selectedPlayer);
}

基本上我有一个添加/编辑表单,我试图看看是否成员ID已经存在于玩家列表中。如果是,在球员列表中编辑相关的球员。如果播放器列表中没有,请添加

编辑抱歉,伙计们,算出来了,因为selected player是一个公共变量,当我改变其中的参数时,它在变量列表中也改变了

确定ID是否存在于类列表中

如果我理解你想用selectedPlayer替换旧的obj,如果它确实存在:

if (obj != null)
{
    int index = Variables.players.IndexOf(obj);
    Variables.players.RemoveAt(index);
    Variables.players.Insert(index, selectedPlayer);
}
var obj = Variables.players.FirstOrDefault(player => player.MembershipID  == selectedPlayer.MembershipID);
if (obj == null)
{
    Variables.players.Add(selectedPlayer);
}
else
{
    //use obj
}

当你说编辑播放器的关联时,我猜你想更新播放器对象的相关属性。

在上面的代码中通过//使用obj意味着你可以做这样的事情:

 obj.OtherProperty = selectedPlayer.OtherProperty;

注意:OtherProperty只是一个例子。请参考需要更新的对象属性

或者你可以简单地在播放器列表的相同索引处删除和插入对象,如其他答案所述。

我不完全清楚你的问题是什么与obj那里,因为你的逻辑看起来就像它意味着做什么你说它正在做。也许你是想把你的obj != null换成obj == null ?

在任何情况下,看起来你想做的更像这样:

if (!Variables.players.Any(player => player.MembershipID  == selectedPlayer.MembershipID))
{
    Variables.players.Add(selectedPlayer);
}

虽然我很想重写你的玩家类型的EqualsGetHashCode功能,或者创建一个IEqualityComparer。然后,您可以使用HashSet来处理您想要做的事情。显然,只有当你能控制Variables.players时,这才有意义。

class PlayerComparer : IEqualityComparer<Player>
{
    public bool Equals(Player a, Player b)
    {
        if (a == null)
            return b == null;
        else if (b == null)
            return a == null;
        else
            return a.MembershipID == b.MembershipID;
    }
}

一旦你有了,你可以实例化Variables.players:

public HashSet<Player> players = new HashSet<Player>(new PlayerComparer());

并按如下方式使用。如果添加了该对象,则返回true;如果该对象已经存在,则返回false。

Variables.players.Add(selectedPlayer);

编辑:

好吧,也许我现在明白了。感谢Selman22的回答,我得到的印象是,您想要更新原始列表中的项目,使其具有selectedPlayer中的值?

如果是这样的话,那么我认为c#中的变量传递可能存在一些误解。当调用obj = selectedPlayer时,实际上并没有改变obj的原始值。相反,您正在更改obj引用的内存位置

您可能想要这样做:

var temp = Variables.players.FirstOrDefault(player => player.MembershipID  == selectedPlayer.MembershipID);
if (temp != null)
{
    Variables.players[Variables.players.IndexOf(temp)] = selectedPlayer;
}
else
{
    Variables.players.Add(selectedPlayer);
}

请注意,当然,其中一些操作(int索引器属性和IndexOf的使用)依赖于Variables.players的类型,我们没有给出。

为了说明原始代码的作用,这里有一个简短的控制台程序:
int a = 5;
int b = a;
Console.WriteLine(a); // 5
Console.WriteLine(b); // 5
b = 2;
Console.WriteLine(a); // 5
Console.WriteLine(b); // 2

可以看到,这创建了两个变量(我选择int类型,因为它是说明同一观点的简单方法),一个等于另一个,然后将每个变量写出来,然后将其中一个更改为另一个值,然后再次将每个变量写出来。评论表明了结果。可以看到,对b的后一个赋值不会通过a传播回去。您将需要另一个a = b来反映这方面的更改。