2015-11-10 38 views
1

我使用併發字典addOrUpdate在C#。問題是這個字典並不支持整個字典(列表)而不是它,它只是將最後一個記錄添加到字典中,並且該記錄在字典中多次找到;我在foreach循環中遍歷它。併發字典AddOrUpdate不添加,更新並返回正確

//Volunteer Class 
public class VolunteerMessage 
{ 
    #region Variables 
    public int UserId; 
    public string UserName; 
    public double Longitude; 
    public double Latitude; 
    public string Message; 
    public string LocationTime; 
    #endregion 

    #region Public Methods 
    public VolunteerMessage(string longit, string latit, string msg) 
    { 
     Message = msg; 
     try 
     { 
      Longitude = Convert.ToDouble(longit); 
      Latitude = Convert.ToDouble(latit); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.Message); 
     } 
    } 
    #endregion 
} 

private readonly ConcurrentDictionary<int, VolunteerMessage> _volunteerdict; 
_volunteerdict = new ConcurrentDictionary<int, VolunteerMessage>(); 
var vappProDataObj = new VolunteerMessage(null, null, null); 

try 
{ 
    for (var i = 0; i < dsVolunteers.Tables[0].Rows.Count; i++) 
    { 
     vappProDataObj.UserId = Convert.ToInt32(dsVolunteers.Tables[0].Rows[i]["UserID"]); 
     vappProDataObj.UserName = dsVolunteers.Tables[0].Rows[i]["UserName"].ToString(); 
     vappProDataObj.Longitude = Convert.ToDouble(dsVolunteers.Tables[0].Rows[i]["Latitude"].ToString()); 
     vappProDataObj.Latitude = Convert.ToDouble(dsVolunteers.Tables[0].Rows[i]["Longitude"].ToString()); 
     vappProDataObj.LocationTime = dsVolunteers.Tables[0].Rows[i]["LocationTime"].ToString(); 
     _volunteerdict.AddOrUpdate(vappProDataObj.UserId, vappProDataObj, (k, v) => vappProDataObj); 

     Console.WriteLine(" Location Updaetd for " + vappProDataObj.UserName); 
    } 
    LogManager.Instance.WriteMessage("Volunteers List refreshed", "RefreshVolunteersList", null); 
} 
catch (Exception e) 
{ 
    LogManager.Instance.WriteMessage("Volunteers List refreshing failed", "RefreshVolunteersList", e); 
} 

和循環是在這裏:

VolunteerMessage itemFound = null; 
double distance = 0; 
foreach (var item in _volunteerdict) 
{ 
    distance = GetDistanceFromLatLonInKm(Convert.ToDouble(e.Latit), Convert.ToDouble(e.Longit), Convert.ToDouble(item.Value.Latitude), Convert.ToDouble(item.Value.Longitude)); 

    if (distance <= 1000) 
    { 
     itemFound = item.Value; 

     if (!itemFound.Equals(null)) 
     { 
      Console.WriteLine(itemFound.UserName + " Is at " + distance + " from Location"); 
      _xmppConn.SendPrivateMessageXmpp(itemFound.UserName, e.Mesag); 
     } 
     else 
      Console.WriteLine("No User found near message area"); 
    } 
} 

請告訴我,我在做什麼錯誤?

在此先感謝

+0

'AddOrUpdate'不正是它說,它增加了一個項目,如果它*不*存在,或者如果它確實* *更新它。你只是建立VolunteerMessage'的'一個實例,你可能使用循環迭代之間相同'UserId',因此你有更新的最後一個值只落得。 –

+0

@YuvalItzchakov我如何維護所有記錄到字典而不是最後一個?請給解決方案 –

+0

不要重複使用相同的'UserId'。每次迭代發出一個新的ID。這可能意味着每次都有一個「VolunteerMessage」的新實例。 –

回答

3

你只能做的vappPropDataObj一個實例,並正在編輯它的價值,而不是讓該對象的多個實例,每個都有自己獨特的價值觀。因此,您的字典中有許多鍵,所有這些鍵都指向同一個單一的vappPropDataObj對象。

試着寫這樣的事情,而不是:

private readonly ConcurrentDictionary<int, VolunteerMessage> _volunteerdict; 

try 
{ 
    for (var i = 0; i < dsVolunteers.Tables[0].Rows.Count; i++) 
    { 
     var vappProDataObj = new VolunteerMessage(null, null, null); 

     vappProDataObj.UserId = Convert.ToInt32(dsVolunteers.Tables[0].Rows[i]["UserID"]); 
     vappProDataObj.UserName = dsVolunteers.Tables[0].Rows[i]["UserName"].ToString(); 
     vappProDataObj.Longitude = Convert.ToDouble(dsVolunteers.Tables[0].Rows[i]["Latitude"].ToString()); 
     vappProDataObj.Latitude = Convert.ToDouble(dsVolunteers.Tables[0].Rows[i]["Longitude"].ToString()); 
     vappProDataObj.LocationTime = dsVolunteers.Tables[0].Rows[i]["LocationTime"].ToString(); 
     _volunteerdict.AddOrUpdate(vappProDataObj.UserId, vappProDataObj, (k, v) => vappProDataObj); 

     Console.WriteLine(" Location Updaetd for " + vappProDataObj.UserName); 
    } 
    LogManager.Instance.WriteMessage("Volunteers List refreshed", "RefreshVolunteersList", null); 
} 
catch (Exception e) 
{ 
    LogManager.Instance.WriteMessage("Volunteers List refreshing failed", "RefreshVolunteersList", e); 
} 
+0

如果'VolunteerMessage'是一個結構體,那應該沒有問題 - 但我認爲它是一個類。 –

+0

@Verarind啊,那是真的。我沒有想到這一點。正如你所說,這不太可能是一個結構。 – Oliver

+0

它的工作!謝謝@Oliver –

1

你正在做更新單個VolunteerMessage,並期待它成爲衆多對象進入字典時。

你需要在循環使消息的多個副本創建一個新的VoluteerMessage,否則一切都在你的字典條目將指向有它的特性在發生了多次改變同一條消息。