C#字典(dictionary)中的旧value被新value替换了

qq_30229835 2016-10-12 10:57:43
以下代码中第49行,Storage这个类中的字典的旧value被新value取代,但是key没有被取代,求解
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DirectoryInfo dir = new DirectoryInfo(".");//new DirectoryInfo(".")
FileInfo[] inf = dir.GetFiles();
StreamReader rd;//用于打开“A5E”文件
Storage stor = new Storage();//实例化

foreach (FileInfo finf in inf)
{
if (finf.Extension.Equals(".A5E")) //如果扩展名为“.A5E”
{
string path = finf.Name;
rd = File.OpenText(path);
string s = rd.ReadToEnd();
string[] sArray = s.Split('&'); // split the string into seperate strings using &

Storage.counter = 0;

for (int i = 0; i < sArray.Length; i++)//i是区分按照& split分开的部分
{
if (i % 2 == 1)
{
string[] lineArray = sArray[i].Split('\n'); //利用正则表达式将字符串中的数字提取出来分别保存在小数数组中
for (int ii = 7; ii < (lineArray.Length - 3); ii++) //ii是为了区分everyline of reinforcement layers
{
Storage.counter++;
MatchCollection vMatchs = Regex.Matches(lineArray[ii], @"((-?\d+)(\.\d+)?)");//读取出lineArray中的小数,并存在数组中
double[] vDouble = new double[vMatchs.Count];
for (int j = 0; j < vMatchs.Count; j++)//j是为了迭代读取出存储在vMatch中的每一行的小数
{
vDouble[j] = double.Parse(vMatchs[j].Value);//store the number of the line into vInts array
}
stor.NS = vDouble[0];
stor.averageStress = vDouble[4];
Storage.Dic.Add(Storage.counter, stor);/////出现了大大的问题,字典中的旧值被新值覆盖了
}
}
}
}
}
}
}

public class Storage
{
public static int counter = 0;//用于对A5E中的字典进行计数(key)
public double NS
{ get; set; }
public double averageStress
{ get; set; }
public static SortedDictionary<int, Storage> Dic = new SortedDictionary<int, Storage>();
}

}
...全文
1995 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
零幺零幺 2017-10-17
  • 打赏
  • 举报
回复
谢谢,xuzuning
零幺零幺 2017-10-17
  • 打赏
  • 举报
回复
太棒了,刚刚遇到这个问题,谢谢你们
qq_30229835 2016-10-13
  • 打赏
  • 举报
回复
结题给分的时候系统有毛病啊,比如想给60,不能直接输入60.要输入600,再删掉一个0才可以。大神们何不帮着解决以下?
qq_30229835 2016-10-13
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
....... 原来你的问题是为什么dic里面所有的sort都是相同的。。。。 原因5L已经回复你了,要修正的话,将那句移动到循环里面
谢谢,完美解决了。土木本科生目前在编分析软件,遇到了问题多亏有大神们帮着解决!!
qq_30229835 2016-10-13
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你的 Storage stor = new Storage(); 在循环外 那么循环内 Storage.Dic.Add(Storage.counter, stor); 添加的都是同一个对象 自然是所有 键 的值是相同的(因为对象传递的是引用) 你需要在循环内实例化,才能保证每个 键 有不同的值
真的太感谢了!!按照你说的,完美解决了!!!
  • 打赏
  • 举报
回复
....... 原来你的问题是为什么dic里面所有的sort都是相同的。。。。 原因5L已经回复你了,要修正的话,将那句移动到循环里面
  • 打赏
  • 举报
回复
哥,dictionary的键值对是成对出现的,怎么可能出现key没有相同,但value变了,你这个value到底是哪里的value 然后你这个dic还是static的
EnForGrass 2016-10-13
  • 打赏
  • 举报
回复
引用 4 楼 qq_30229835 的回复:
[quote=引用 3 楼 starfd 的回复:] key相同根本add不进去,会报key已存在
key没有相同,但是旧的value被新的value取代了[/quote] key是有可能相同的,因为Storage.counter = 0;你是放到 foreach (FileInfo finf in inf)里面的,如果有不止一个inf,Storage.counter会归为0,那么就有可能重复啊,是不是应该放在外面?
xuzuning 2016-10-13
  • 打赏
  • 举报
回复
你的 Storage stor = new Storage(); 在循环外 那么循环内 Storage.Dic.Add(Storage.counter, stor); 添加的都是同一个对象 自然是所有 键 的值是相同的(因为对象传递的是引用) 你需要在循环内实例化,才能保证每个 键 有不同的值
qq_30229835 2016-10-13
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
key相同根本add不进去,会报key已存在
key没有相同,但是旧的value被新的value取代了
  • 打赏
  • 举报
回复
key相同根本add不进去,会报key已存在
qq_30229835 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
Add无法替换舅KeyPair对,如果存在相同key ,将会报错 你可以使用 dic[Storage.counter]=stor; 来进行字典赋值
谢谢你。我使用Add方法,新值确实替代了旧值,我逐步循环了一下。每循环一次,stor中的NS和averageStress都有新的值,因为之前存储在字典中的value其实就是stor中的NS和averageStress,所以旧的stor被新的stor替换,字典中的value也就被替换了。
stherix 2016-10-12
  • 打赏
  • 举报
回复
Add无法替换舅KeyPair对,如果存在相同key ,将会报错 你可以使用 dic[Storage.counter]=stor; 来进行字典赋值

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧