List<T>.Add(T) 引用类型与值类型
2015-02-13 11:45
274 查看
问题原因:
在考试系统中,题型的添加是由题型的组件构成的。而在题型中,选择题,则应该是由一个题型基类(题干)和四个单选按钮组成的。
这个非常容易理解。
每个组件,都对应详情信息 比如:题型基类(题型、难度等级、章节范围等) 选项(选项、是否单选、是否乱序)
对于题型的添加,则是通过查询 添加的组件详情,进行拼凑。然后进行的添加。
如上图的题型,需要添加五条记录。(一个题干,四个选项) 四个选项里面稍有不同。
拼出要添加的内容。
添加大致为:
NewQuestionTypeDetails.add(题干详情)
for (int i = 0; i < 4; i++)
{
NewQuestionTypeDetails.add(选项);
}
添加完成后,需要对里面的各个选项 分别转换为 选项A、选项B…… 以及 里面的主外键关系。
//修改详情里面的外键
foreach (var item in NewQuestionTypeDetails)
{
System.Guid tempQuestionTypeDetailsGuid = System.Guid.NewGuid();
item.ExamQuestionTypeEntityQuestionTypeId = tempQuestionTypeGuid.ToString();
item.QuestionTypeDetailsId = tempQuestionTypeDetailsGuid.ToString();
}
这样的一个实体,就可以保存到数据库里面。当作该题型的详情。
但是如果是这样做的话,你会看到如下这样的信息:
四个选项的 默认主键,是一样的…………
对出现的问题进行分析:
List<T>.add(T) 添加的是T的引用(即把T的地址添加到List中)
这样的添加,四个选项对应的一个地址。所以在给选项添加主键的时候,添加了四次。不过是在同一个地址上。所以都被覆盖掉了,只留下最后一次的主键值。
解决方案:
在查询
选项组件的时候,把查询到的选项组件详情信息的时候。复制一份,然后在添加到新题型实体中。
NewQuestionTypeDetails.add(题干详情)
for (int i = 0; i < 4; i++)
{
ExamQuestionTypeEntity tempCompementDetails= new ExamQuestionTypeEntity();
tempCompementDetails=选项.clone();
NewQuestionTypeDetails.add(tempCompementDetails);
}
这样,主键的赋值,就不会因为地址而被重复覆盖了。当然,这种做法消耗的是内存。
List<T>.add(T) 在T为实体 的时候,那么添加的就是引用类型。
在使用List<T>.add(T) 一定要考虑清楚,是添加引用还是添加值。不考虑这个 报的错自己都不知道如何下手了。
在考试系统中,题型的添加是由题型的组件构成的。而在题型中,选择题,则应该是由一个题型基类(题干)和四个单选按钮组成的。
这个非常容易理解。
每个组件,都对应详情信息 比如:题型基类(题型、难度等级、章节范围等) 选项(选项、是否单选、是否乱序)
对于题型的添加,则是通过查询 添加的组件详情,进行拼凑。然后进行的添加。
如上图的题型,需要添加五条记录。(一个题干,四个选项) 四个选项里面稍有不同。
拼出要添加的内容。
添加大致为:
NewQuestionTypeDetails.add(题干详情)
for (int i = 0; i < 4; i++)
{
NewQuestionTypeDetails.add(选项);
}
添加完成后,需要对里面的各个选项 分别转换为 选项A、选项B…… 以及 里面的主外键关系。
//修改详情里面的外键
foreach (var item in NewQuestionTypeDetails)
{
System.Guid tempQuestionTypeDetailsGuid = System.Guid.NewGuid();
item.ExamQuestionTypeEntityQuestionTypeId = tempQuestionTypeGuid.ToString();
item.QuestionTypeDetailsId = tempQuestionTypeDetailsGuid.ToString();
}
这样的一个实体,就可以保存到数据库里面。当作该题型的详情。
但是如果是这样做的话,你会看到如下这样的信息:
四个选项的 默认主键,是一样的…………
对出现的问题进行分析:
List<T>.add(T) 添加的是T的引用(即把T的地址添加到List中)
这样的添加,四个选项对应的一个地址。所以在给选项添加主键的时候,添加了四次。不过是在同一个地址上。所以都被覆盖掉了,只留下最后一次的主键值。
解决方案:
在查询
选项组件的时候,把查询到的选项组件详情信息的时候。复制一份,然后在添加到新题型实体中。
NewQuestionTypeDetails.add(题干详情)
for (int i = 0; i < 4; i++)
{
ExamQuestionTypeEntity tempCompementDetails= new ExamQuestionTypeEntity();
tempCompementDetails=选项.clone();
NewQuestionTypeDetails.add(tempCompementDetails);
}
这样,主键的赋值,就不会因为地址而被重复覆盖了。当然,这种做法消耗的是内存。
List<T>.add(T) 在T为实体 的时候,那么添加的就是引用类型。
在使用List<T>.add(T) 一定要考虑清楚,是添加引用还是添加值。不考虑这个 报的错自己都不知道如何下手了。
相关文章推荐
- 类型安全:方法add(Object)属于原始类型List。应该将对通用类型List<E>的引用参数化
- hibernate 返回List<Map>, List<xxx>对象列表类型
- C# List<> add函数总是覆盖List中原有元素的解决办法
- LinkedList<T>.AddLast 方法 (LinkedListNode<T>)
- Android中将List<Map<String, Object>>类型数据与字符串的相互转化
- 将一个LIST分组,转为map<string,list>类型
- mybatis查询如何返回List<Map>类型数据
- 用反射属性类型为:java.util.List<com.abc.User>
- 关于List<Model>类型 GridView排序问题的解决
- List<int>是值类型还是引用类型
- C# List<>.Add一个细节
- 【转】Apache CXF入门范例以及对传递List<Map>类型的疑惑
- Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
- 理解C#值类型与引用类型 <转>
- NHibernate初探(二) 对于IList<object[]>到持久类类型的转换
- winform DataGridView绑定List<T>类型数据
- List<Map>类型的JavaScript数组应用范例:图片多样化显示
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- 在JavaScript中实现类似Java中List<Map>类型的数组
- mybatis返回类型string,或者对象,均可用list<string>或者,list<对象>来接收