C#将列表添加到列表中

时间:2010-12-27 22:41:27

标签: c#

我有一个DocumentList.c,如下所示。当我尝试将一个列表添加到DocumentList对象的实例中时,它会添加但其他的是相同的

 class DocumentList
    {
        public static List wordList;
        public static string type;
        public static string path;
        public static double cos;
        public static double dice;
        public static double jaccard;
        //public static string title;

        public DocumentList(List wordListt, string typee, string pathh, double sm11, double sm22, double sm33)
        {
            type = typee;
            wordList = wordListt;
            path = pathh;
            cos = sm11;
            dice = sm22;
            jaccard = sm33;
        }
    }

在主c#代码片段

public partial class Window1 : System.Windows.Window
    {

        static private List documentList = new List();

...

在我使用的方法中。

DocumentList dt = new DocumentList(para1, para2, para3, para4, para5, para6);
                documentList.Add(dt);

现在,当我添加第一个列表时,它似乎是documentList中的1个项目,但是对于第二个列表,我得到一个包含2个项目的列表,但两者都相同..

我的意思是我不能保留以前的列表项..

3 个答案:

答案 0 :(得分:4)

使用通用List<T>代替,它会更容易阅读和理解,并且性能会降低很多(有关泛型的更多内容,请阅读this):

class DocumentList
{
    //via a (non-static - read link below) field:
    public List<string> wordList;

    //via a property (read link below):
    public List<string> WordList { get; set; }
    //----------
    public DocumentList(List<string> wordList, .....
    {
        //Sets property
        this.WordList = wordList;

        //Sets field
        this.wordList = wordList;
        //etc.
    }
}


private partial class Window1
{
    private List<DocumentList> documentList = new List<DocumentList>();
}

this关键字引用当前实例(即DocumentList类中声明的成员)。

我不明白的是,为什么你要将所有成员声明为静态,如果它是不可变的,那么你应该将它声明为readonly,一旦你将你的字段标记为静态,它们在所有实例之间共享,因此列表中变量项的值实际上指的是与它共享的值相同的值,一旦更新成员,它就会更新“共享”字段,并且您在所有实例中看到相同的值田野。 我强烈建议您阅读this

另一个好主意是用properties包裹你的字段。

答案 1 :(得分:3)

您在第一个实例中覆盖值的原因是您已将所有字段标记为static。静态字段,属性和方法在类的所有实例之间共享。

除此之外,使用List<string>并避免不得不来回演绎。

答案 2 :(得分:2)

问题是您已将所有类成员声明为静态。这意味着您的所有实例将共享相同的值,并且对一个对象的修改也会影响所有其他实例。删除static关键字,以便每个实例都有自己的数据。

class DocumentList
{
    public List wordList;
    // etc...

另外,作为一种风格问题,你不应该有公共领域。要么将它们设为私有,要么将它们变成属性。您可能还想考虑只公开吸气剂。