为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在列表<>中添加新值会覆盖列表<>中的先前值

为什么在列表<>中添加新值会覆盖列表<>中的先前值

C#
小怪兽爱吃肉 2019-07-23 15:16:15
为什么在列表<>中添加新值会覆盖列表<>中的先前值我实际上是在尝试将多个项目添加到列表中,但最后所有项目都具有与最后一项相同的值。public class Tag{     public string TagName { get; set; }}List<Tag> tags = new List<Tag>();Tag _tag = new Tag();string[] tagList = new[]{"Foo", "Bar"};foreach (string t in tagList){     _tag.tagName = t; // set all properties     //Add class to collection, this is where all previously added rows are overwritten     tags.Add(_tag);}上面的代码生成两个项目的列表,TagName当我期望一个"Foo"和一个时,设置为“Bar” "Bar"。为什么所有项目在结果列表中具有相同的属性?解释为什么更改public class Tag以public struct Tag使此代码按预期工作(不同的项具有不同的值)的加分点。如果重要的是我的实际目标是创建派生集合类,但由于问题只发生在列表中,它可能是可选的,仍然显示我的目标在下面。按照一些教程,我可以成功创建一个集合类,它继承了创建DataTable所需的功能,可以将其作为表值参数传递给Sql Server的存储过程。一切似乎都运作良好; 我可以添加所有行,它看起来很漂亮。但是,仔细观察后,我注意到当我添加一个新行时,所有前一行的数据都会被新行的值覆盖。因此,如果我有一个字符串值为“foo”的行,并且我添加了第二行,其值为“bar”,则将插入第二行(使用两行的DataTable),但这两行的值都为“bar” ”。任何人都可以看到为什么会这样?这是一些代码,以下是Collection类:using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Web;using Microsoft.SqlServer.Server;namespace TagTableBuilder{public class TagCollection : List<Tag>, IEnumerable<SqlDataRecord>{     IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator()     {         var sdr = new SqlDataRecord(             new SqlMetaData("Tag", SqlDbType.NVarChar)             );         foreach (Tag t in this)         {             sdr.SetSqlString(0, t.tagName);             yield return sdr;         }     }}public class Tag{     public string tagName { get; set; }}}这些被称为如下://Create instance of collectionTagCollection tags = new TagCollection();//Create instance of objectTag _tag = new Tag();foreach (string t in tagList){     //Add value to class propety      _tag.tagName = t;     //Add class to collection, this is where all previously added rows are overwritten     tags.Add(_tag);}
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

在将标记添加到集合的循环中,您使用的是Tag的相同对象实例。基本上,您将Tag的名称设置为tagList中的第一个值并将其添加到集合中,然后您将相同的Tag的名称更改为tagList中的第二个值,并将其再次添加到集合中。

您的标签集合包含对同一Tag对象的多个引用!每次在设置标记名称并将其添加到集合之前,在for循环内实例化_tag。


查看完整回答
反对 回复 2019-07-23
  • 2 回答
  • 0 关注
  • 539 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信