C# 自己的类对象属性被覆盖
我用attributes字符串创建了一个对象,另一个是C# 自己的类对象属性被覆盖,c#,C#,我用attributes字符串创建了一个对象,另一个是列表。 我还创建了一个静态列表,然后在其中添加所有对象。 现在我的问题是第二个属性被覆盖了 例如,我有3个对象: Object1: "Name"; List with 3 Strings Object2: "Name2"; List with 2 Strings Object3: "Name3"; List with 5 Strings 如果我现在将它们添加到我的对象列表中,看起来是这样的 Name; List with 5 Strings
列表
。
我还创建了一个静态列表
,然后在其中添加所有对象。
现在我的问题是第二个属性被覆盖了
例如,我有3个对象:
Object1: "Name"; List with 3 Strings
Object2: "Name2"; List with 2 Strings
Object3: "Name3"; List with 5 Strings
如果我现在将它们添加到我的对象列表中,看起来是这样的
Name; List with 5 Strings
Name2; List with 5 Strings
Name3; List with 5 Strings
它会将第二个属性覆盖到列表中的所有其他对象
代码:
for (int i = 0; i < 100; i++)
{
if (elo.ReadObjMask(i) > 0)
{
var iRet = elo.PrepareObjectEx(0, 0, i);
maskenname = elo.ObjMName();
if (maskenname != "")
{
for (int e = 0; e < 50; e++)
{
string eigenschaft = elo.GetObjAttribName(e);
if (eigenschaft != "" && eigenschaft != "-")
{
eigenschaften.Add(eigenschaft);
}
}
allMasks.Add(maskenname);
}
else
{
// Do nothing
}
EloMask emask = new EloMask(maskenname, eigenschaften);
staticVariables.allMask.Add(emask);
eigenschaften.Clear();
}
}
for(int i=0;i<100;i++)
{
如果(elo.ReadObjMask(i)>0)
{
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
其他的
{
//无所事事
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
eagenschaften.Clear();
}
}
这是我的对象类:
public class EloMask
{
public string name;
public List<String> eigenschaften;
public EloMask(string iname, List<String> ieigenschaften)
{
name = iname;
eigenschaften = ieigenschaften;
}
}
公共类掩码
{
公共字符串名称;
公开名单;
公共EloMask(字符串iname,列表ieigenschaften)
{
name=iname;
本征Schaften=ieigenschaften;
}
}
以下是一个示例,说明如何做您想做的事情:
public static List<Person> PersonsList = new List<Person>();
public static Random rd = new Random();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
List<string> tmpAbilities = new List<string>() {((char)rd.Next(255)).ToString(), ((char)rd.Next(255)).ToString() , ((char)rd.Next(255)).ToString() };
Person tmpPerson = new Person("TmpName_"+i,tmpAbilities);
PersonsList.Add(tmpPerson);
}
foreach (var persona in PersonsList)
{
Console.WriteLine(persona);
}
}
public class Person
{
public string Name { get; set; }
public List<string> Abilities;
public Person(string name,List<string> abilities)
{
Name = name;
Abilities = abilities;
}
public override string ToString()
{
string retVal = $"Name: {Name}\n";
foreach (var ability in Abilities)
{
retVal += $"Ability : {ability}\n";
}
return retVal;
}
}
public static List PersonsList=new List();
公共静态随机rd=新随机();
静态void Main(字符串[]参数)
{
对于(int i=0;i<5;i++)
{
List tmabilities=new List(){((char)rd.Next(255)).ToString(),((char)rd.Next(255)).ToString(),((char)rd.Next(255)).ToString()};
人员tmpPerson=新人员(“TmpName_”+i,TMP能力);
PersonsList.Add(tmpPerson);
}
foreach(PersonList中的变量persona)
{
控制台。写线(人物角色);
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公开列表能力;
公众人物(字符串名称、列表能力)
{
名称=名称;
能力=能力;
}
公共重写字符串ToString()
{
string retVal=$“Name:{Name}\n”;
foreach(能力中的var能力)
{
retVal+=$“能力:{Ability}\n”;
}
返回返回;
}
}
用于(int i=0;i<100;i++)
{
如果(elo.ReadObjMask(i)>0)
{
//在此处创建一个新列表
eigenschaften=新列表();
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
其他的
{
//无所事事
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
}
}
列表始终指向同一个实例,因为您传递的是对列表的引用,而不是副本。因此,对于您将该列表传递到的每个EloMask
,该列表将被清除并再次填充
要解决您的问题,请创建一个新列表:
if (elo.ReadObjMask(i) > 0)
{
var iRet = elo.PrepareObjectEx(0, 0, i);
maskenname = elo.ObjMName();
// create a new list here!!!
var eigenschaften = new List<string>();
if (maskenname != "")
{
for (int e = 0; e < 50; e++)
{
string eigenschaft = elo.GetObjAttribName(e);
if (eigenschaft != "" && eigenschaft != "-")
{
eigenschaften.Add(eigenschaft);
}
}
allMasks.Add(maskenname);
}
EloMask emask = new EloMask(maskenname, eigenschaften);
staticVariables.allMask.Add(emask);
// clearing the list is no longer needed
}
if(elo.ReadObjMask(i)>0)
{
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
//在这里创建一个新列表!!!
var eigenschaften=新列表();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
//不再需要清除列表
}
您需要指定“Object”类的代码,以及实例化和添加到静态列表的方式。staticVariables.allMask.Add(emask);在这一部分中,我将其添加到我的静态列表中,我相信:EloMask emask=新的EloMask(maskenname,eigenschaften);正在将eigenschaften作为引用传递,因此当它被更改时,所有其他的都将被更改。在写入列表之前,需要启动列表的新实例。特征值=新列表;请尝试更改这一行:exigenschaften.Clear();to eigenschaften=新列表();天哪,太容易了!谢谢,这解决了我的问题!谢谢你,特洛伊!这里缺少()项:eigenschaften=新列表;没问题,我再次非常感谢你!我昨天挣扎了3个小时哈哈:D
if (elo.ReadObjMask(i) > 0)
{
var iRet = elo.PrepareObjectEx(0, 0, i);
maskenname = elo.ObjMName();
// create a new list here!!!
var eigenschaften = new List<string>();
if (maskenname != "")
{
for (int e = 0; e < 50; e++)
{
string eigenschaft = elo.GetObjAttribName(e);
if (eigenschaft != "" && eigenschaft != "-")
{
eigenschaften.Add(eigenschaft);
}
}
allMasks.Add(maskenname);
}
EloMask emask = new EloMask(maskenname, eigenschaften);
staticVariables.allMask.Add(emask);
// clearing the list is no longer needed
}