如果类列表中存在ID,则DITDetermining

时间:2014-08-08 00:30:12

标签: c# list

我正在尝试确定玩家列表中是否已存在玩家,如果他们确实要更新他们的数据,但是如果他们不在那里,我就是要添加它们。我遇到的问题是obj被设置为selectedPlayer,因此它不是null并且它会覆盖旧记录而不是添加新记录。

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

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

修改 对不起,伙计们,研究出来,因为选择的播放器是一个公共变量,当我更改其中的参数时,它在变量列表中发生了变化。

3 个答案:

答案 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);
}

虽然我很想覆盖播放器类型的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'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);
}