2016-02-21 37 views
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; 
} 

回答

1

我不知道GetUTCTime方法是做什麼的,但是,假設它返回當前時間的某種度量,很可能它會連續幾次返回same value

因此你將有一個重複的關鍵,因爲第二場val有兩個230的元素:

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

如果你wan't產生像鑰匙獨特的時間戳,您可以檢查How to ensure a timestamp is always unique?

+0

我添加了getutctime方法定義。並且val不會0檢查Score類的構造函數 – bytestorm

+0

另外在當前的例子中,時間戳不會被檢查,因爲沒有任何分數是相等的 – bytestorm

+1

@bytestorm既然230不等於230?而且,由於您將時間戳轉換爲整數值,如果兩個對象的創建時間相同,則它們將具有相同的時間戳。 –

相關問題