确定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是一个公共变量,当我改变其中的参数时,它在变量列表中也改变了
如果我理解你想用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);
}
虽然我很想重写你的玩家类型的Equals
和GetHashCode
功能,或者创建一个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
来反映这方面的更改。