ArgumentException:SortedSet

时间:2016-02-21 14:31:29

标签: c# sorting unity3d unity5 sortedlist

我在C#中使用SortedList时遇到了一些问题(我正在使用Visual Studio 2015处理Unity 5.0.3)。我有两个课程ScoreKey和Score。 ScoreKey实现了IComparable。

但是当我尝试向SortedList添加条目时,我收到了错误

ArgumentException: element already exists
System.Collections.Generic.SortedList`2[ScoreKey,Score].PutImpl (.ScoreKey key, .Score value, Boolean overwrite)

我无法弄清楚为什么会收到此错误。我使用类的实例作为键,因此没有机会拥有相同的键,对吧?这是代码。

课程定义:

public class ScoreKey : IComparable
{
    public uint val;
    public uint timestamp;
    public int CompareTo(object obj)
    {
        ScoreKey s2 = obj as ScoreKey;
        if (s2.val == val)
        {
            return timestamp.CompareTo(s2.timestamp);
        }
        return val.CompareTo(s2.val);
    }
}
[System.Serializable]
public class Score
{

    public ScoreKey key;
    public uint val
    {
        get { return key.val; }
    }
    string user;
    public uint timestamp
    {
        get
        {
            return key.timestamp;
        }
    }
    public Score(string _user, uint _score)
    {
        key = new ScoreKey();
        key.timestamp = GetUTCTime();
        user = _user;
        key.val = _score;
    }
}

测试代码:

SortedList<ScoreKey, Score> scoreList = new SortedList<ScoreKey, Score>();
Score[] scores = {
    new Score("Bishal", 230),
    new Score("Bishal", 3456),
    new Score("Bishal", 230),
    new Score("Bishal", 123),
    new Score("Bishal", 86),
    new Score("Bishal", 4221)
};
for(int i = 0; i< scores.Length; i++)
{
    Debug.Log(scores[i].pretty);

    scoreList.Add(scores[i].key, scores[i]);
}

修改

** GetUTCTime功能:**

public static uint GetUTCTime()
{
   return (uint)(System.DateTime.UtcNow.Subtract(new System.DateTime(1970, 1, 1))).TotalSeconds;
}

1 个答案:

答案 0 :(得分:1)

我不知道GetUTCTime方法做了什么,但是,假设它返回当前时间的一些度量,很有可能它在一个时间内返回same value几次。行。

因此,您将拥有一个重复键,因为第二个字段val在两个元素中为230:

new Score("Bishal", 230),
new Score("Bishal", 3456),
new Score("Bishal", 230),

如果您不想生成像键一样的唯一时间戳,可以查看How to ensure a timestamp is always unique?