我正在尝试确定玩家列表中是否已存在玩家,如果他们确实要更新他们的数据,但是如果他们不在那里,我就是要添加它们。我遇到的问题是obj被设置为selectedPlayer,因此它不是null并且它会覆盖旧记录而不是添加新记录。
var obj = Variables.players.FirstOrDefault(player => player.MembershipID == selectedPlayer.MembershipID);
if (obj != null)
{
obj = selectedPlayer;
}
else
{
Variables.players.Add(selectedPlayer);
}
基本上我有一个添加/编辑表单,我试图查看会员ID是否已经存在于玩家列表中。如果是,请编辑玩家列表中的相关玩家。如果播放器列表中不存在,请添加
修改 对不起,伙计们,研究出来,因为选择的播放器是一个公共变量,当我更改其中的参数时,它在变量列表中发生了变化。
答案 0 :(得分:1)
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只是一个例子。请参阅需要更新的对象属性。
或者您可以简单地删除并在播放器列表的相同索引处插入对象,如其他答案中所述。
答案 1 :(得分:1)
我并不完全清楚你在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's answer,我的印象是您要更新原始列表中的项目以获得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
来反映这方面的变化。
答案 2 :(得分:1)
如果我了解您希望将旧obj
替换为selectedPlayer
(如果它存在):
if (obj != null)
{
int index = Variables.players.IndexOf(obj);
Variables.players.RemoveAt(index);
Variables.players.Insert(index, selectedPlayer);
}