我使用併發字典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");
}
}
請告訴我,我在做什麼錯誤?
在此先感謝
'AddOrUpdate'不正是它說,它增加了一個項目,如果它*不*存在,或者如果它確實* *更新它。你只是建立VolunteerMessage'的'一個實例,你可能使用循環迭代之間相同'UserId',因此你有更新的最後一個值只落得。 –
@YuvalItzchakov我如何維護所有記錄到字典而不是最後一個?請給解決方案 –
不要重複使用相同的'UserId'。每次迭代發出一個新的ID。這可能意味着每次都有一個「VolunteerMessage」的新實例。 –