返回相同值的类的静态LIST

时间:2018-03-01 05:40:24

标签: c#

我有两个类,一个包含我想要维护的值,它被声明为[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的成员?

3 个答案:

答案 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循环 - forforeach循环套装,甚至string.Join也是最佳选择:

public string GetAllStrings()
{
    return String.Join(" ", aClass.Select(x => x.something);
}    

请注意,您的代码有很多样式和命名错误,未使用或无用的变量,例如类成员Somethingcnt,并且一般没有多大意义。
您需要遵循C#命名约定和规则,以使您的代码可由其他开发人员读取和理解。