C# 对象字段不保留该值

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

在下面的代码中,我有一个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 = 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;