我有两个类,一个包含我想要维护的值,它被声明为[serializable],因为我可能希望稍后将结果存储在一个文件中。
namespace WindowsFormsApp1
{
[Serializable]
public class Class1
{
string Something = "";
public Class1(string something)
{
Something = something;
}
public Class1()
{
Something = "";
}
public string something
{
get { return Something; }
set { Something = value; }
}
}
}
第二个声明此类的List以及一些访问函数
namespace WindowsFormsApp1
{
class Class2
{
public static List<Class1> aClass = new List<Class1>();
public static int cnt = 0;
public void AddStaticString(Class1 aString)
{
aClass.Add(aString);
cnt++;
}
public string GetAllStrings()
{
string aFullString = "";
int cnt = 0;
while (cnt < aClass.Count)
{
aFullString = aClass[cnt].something;
cnt++;
}
return aFullString;
}
}
}
现在添加到LIST并尝试提取它的一小段代码
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 aClass = new Class1();
Class2 aSClass = new Class2();
aClass.something = "AAAAA";
aSClass.AddStaticString(aClass);
aClass.something = "BBBBB";
aSClass.AddStaticString(aClass);
aClass.something = "CCCCC";
aSClass.AddStaticString(aClass);
richTextBox1.Text = aSClass.GetAllStrings();
}
}
}
richTextBox始终只显示最后一项(CCCCC),即使我可以看到输入到LIST的正确值。
我是否可以使用aFullString = aClass[cnt].something;
访问LIST的成员?
答案 0 :(得分:1)
您只是从GetAllStrings
的列表中返回最后一个字符串。相反,您可以将其附加到现有项目,或者可以使用逗号将它们分开,无论您想要什么。
例如,您可以使用以下内容附加这些值:
aFullString += aClass[cnt].something + ",";
但是这会在字符串的末尾留下逗号。
相反,如果你需要逗号分隔值,你可以使用LINQ加入字符串,
public string GetAllStrings()
{
return string.Join(",", aClass.Select(item => item.something));
}
此外,在button1_Click
中,您要将Class1
的同一个实例添加到Class2
的列表中。如果您需要该类的单独实例,则应在调用AddStaticString
之前创建新实例:
private void button1_Click(object sender, EventArgs e)
{
Class2 aSClass = new Class2();
Class1 aClass = new Class1();
aClass.something = "AAAAA";
aSClass.AddStaticString(aClass);
aClass = new Class1();
aClass.something = "BBBBB";
aSClass.AddStaticString(aClass);
aClass = new Class1();
aClass.something = "CCCCC";
aSClass.AddStaticString(aClass);
richTextBox1.Text = aSClass.GetAllStrings();
}
答案 1 :(得分:0)
您应该,但是您分配aFullString
变量的方式将始终显示列表的最后一个值。
你应该这样试试:
public string GetAllStrings()
{
string aFullString = "";
int cnt = 0;
while (cnt < aClass.Count)
{ //+ to keep the previous values too
aFullString += aClass[cnt].something;
cnt++;
}
return aFullString;
}
答案 2 :(得分:0)
在这种方法中:
public string GetAllStrings()
{
string aFullString = "";
int cnt = 0;
while (cnt < aClass.Count)
{
aFullString = aClass[cnt].something;
cnt++;
}
return aFullString;
}
您将aFullString
设置为最后一个收藏项something
。
你想要的可能是字符串连接。您不需要更好地while
循环 - for
或foreach
循环套装,甚至string.Join
也是最佳选择:
public string GetAllStrings()
{
return String.Join(" ", aClass.Select(x => x.something);
}
请注意,您的代码有很多样式和命名错误,未使用或无用的变量,例如类成员Something
和cnt
,并且一般没有多大意义。
您需要遵循C#命名约定和规则,以使您的代码可由其他开发人员读取和理解。