gpt4 book ai didi

c# - 并发字典 AddOrUpdate 没有正确添加、更新和返回

转载 作者:太空宇宙 更新时间:2023-11-03 21:16:49 31 4
gpt4 key购买 nike

我在 C# 中使用并发字典 addOrUpdate。问题是这个字典不是在维护整个字典(列表),而是它只将最后一条记录添加或更新到字典中,并且该记录在字典中多次找到;我在 foreach 循环中遍历了它。

//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");
}
}

请告诉我我做错了什么?

提前致谢

最佳答案

您只创建了一个 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);
}

关于c# - 并发字典 AddOrUpdate 没有正确添加、更新和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33630806/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com