C# 对象字段不保留该值
在下面的代码中,我有一个objectplayer的实例,它的字段是name、numof、s和salience。在第二个for循环中,我为每个player对象设置了val.s的值。然后我把它们加在一起形成一个总和,这很好。但在下一个(第三个)for循环中,我想使用每个对象的这个val.s上的值,但它返回的都是零。谁能告诉我为什么?我提前感谢你的帮助C# 对象字段不保留该值,c#,.net,object,C#,.net,Object,在下面的代码中,我有一个objectplayer的实例,它的字段是name、numof、s和salience。在第二个for循环中,我为每个player对象设置了val.s的值。然后我把它们加在一起形成一个总和,这很好。但在下一个(第三个)for循环中,我想使用每个对象的这个val.s上的值,但它返回的都是零。谁能告诉我为什么?我提前感谢你的帮助 for (int i=0;i<players.Count;i++) { myList.Add(new Player {name = p
for (int i=0;i<players.Count;i++)
{
myList.Add(new Player {name = players[i], numMention=playersNumMentions[i]});
}
var mySummedList = myList.GroupBy(x => x.name).Select(x => new Player { name = x.Key, numMention = x.Sum(y => y.numMention)});
foreach (var val in mySummedList)
{
if (val.numMention > 50000) //differs for different problems
{
sql = "SELECT COUNT(Actor1Code) AS S FROM [gdelt-bq:full.events] WHERE Year>=" + predictionDate + " AND (Actor1Code ='" + val.name + "' AND ((Actor2CountryCode = '" + mainPlayer1 + "') OR (Actor2CountryCode='" + mainPlayer2 + "')))";
response = new WebClient().DownloadString(url + "?q=" + Uri.EscapeUriString(sql));
value = JsonValue.Parse(response);
result = value as JsonObject;
var row = result["modelData"]["rows"][0];
val.s=((int)row["f"][0]["v"]);
sumOfS += val.s;
}
}
foreach (var val in mySummedList)
{
if (val.numMention > 50000) //differs for different problems
{
val.salience = val.s / sumOfS;
Console.WriteLine(String.Format("{0}: {1}", val.name, val.salience));
}
}
for(int i=0;i x.name)。选择(x=>newplayer{name=x.Key,numMention=x.Sum(y=>y.numMention)});
foreach(mySummedList中的var val)
{
if(val.numMention>50000)//因不同的问题而不同
{
sql=“从[gdelt bq:full.events]中选择计数(Actor1Code)作为S,其中年份>=”+predictionDate+“,(Actor1Code=”“+val.name+”)和((Actor2CountryCode=”“+mainPlayer1+”)或(Actor2CountryCode=“+mainPlayer2+”)”);
response=new WebClient().DownloadString(url+“?q=“+Uri.EscapeUriString(sql));
value=JsonValue.Parse(响应);
结果=作为JsonObject的值;
变量行=结果[“模型数据”][“行”][0];
val.s=((int)行[“f”][0][“v”]);
sumOfS+=val.s;
}
}
foreach(mySummedList中的var val)
{
if(val.numMention>50000)//因不同的问题而不同
{
val.salience=val.s/sumOfS;
WriteLine(String.Format(“{0}:{1}”,val.name,val.salience));
}
}
您使用的是LINQ的Select,它会惰性地计算可枚举项:
.Select(x => new Player { name = x.Key, numMention = x.Sum(y => y.numMention)});
如果需要重用Player实例,请尝试在选择后调用ToList:
var mySummedList = myList.GroupBy(x => x.name).Select(x => new Player { name = x.Key, numMention = x.Sum(y => y.numMention)}).ToList();
如果Player是一个struct,它将不起作用,如果它是一个类,则更改foreach而不是do
foreach(var x.....)
做
确保val.s得到的值与0不同
val.salience = val.s / sumOfS;
由于sumOfS
大于val.s
且为整数除法,因此结果为零
您可以将val.salience
类型更改为double,并将行更改为double
val.salience = val.s / (double)sumOfS;
你的意思是只替换{name=x.Key,numMention=x.Sum(y=>y.numMention)});使用{name=x.Key,numMention=x.Sum(y=>y.numMention)}).ToList()?预期产量是多少?如果它在0和1之间,您应该确保您没有使用
int
进行计算,如果numMention
是int
,那么int也会返回Sum()
。您的意思是第三个循环中的val.salience
始终为零?输出(salience)在0和1之间,但是,在类中,显著性是double类型。那么,第三个循环中的零是什么呢?将s和sum改为double而不是int,它就起作用了。谢谢大家:)使用var
应该可以,因为mySummedList
是一个IEnumerable
。
val.salience = val.s / (double)sumOfS;