0
我在使用C#中的SortedList時出現了一些問題(我正在使用Visual Studio 2015開發Unity 5.0.3)。我有兩個ScoreKey和Score類。 ScoreKey實現了IComparable。ArgumentException:在SortedSet中已存在的元素
但是當我嘗試條目添加到排序列表我得到的錯誤
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;
}
我添加了getutctime方法定義。並且val不會0檢查Score類的構造函數 – bytestorm
另外在當前的例子中,時間戳不會被檢查,因爲沒有任何分數是相等的 – bytestorm
@bytestorm既然230不等於230?而且,由於您將時間戳轉換爲整數值,如果兩個對象的創建時間相同,則它們將具有相同的時間戳。 –