【问题标题】:C# adding list into listC#将列表添加到列表中
【发布时间】:2011-05-31 08:26:48
【问题描述】:

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

 类 DocumentList
    {
        公共静态列表 wordList;
        公共静态字符串类型;
        公共静态字符串路径;
        公共静态双cos;
        公共静态双骰子;
        公共静态双提卡;
        //公共静态字符串标题;

        public DocumentList(List wordListt, string typee, string pathh, double sm11, double sm22, double sm33)
        {
            类型 = 类型;
            单词列表 = 单词列表;
            路径 = 路径;
            cos = sm11;
            骰子 = sm22;
            杰卡德 = sm33;
        }
    }

在主c#代码片段中

公共部分类 Window1:System.Windows.Window { 静态私有列表 documentList = new List(); ...

我使用的方法如下。

DocumentList dt = new DocumentList(para1, para2, para3, para4, para5, para6); 文档列表.Add(dt);

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

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

【问题讨论】:

  • 您可能需要考虑显示 Add 方法(因为 DocumentList 似乎是一个基类)。这也是 .NET v2.0 或更高版本吗?
  • 您使用什么 .NET 版本?如果您不确定,可以告诉我们您使用的是哪个版本的 Visual Studio(或任何 IDE)?

标签: c#


【解决方案1】:

改用泛型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 包装你的字段。

【讨论】:

  • 我已经使用了那个实现,但是这里没有看到我新认识的。当然是这样:public static List wordList;
  • 你为什么使用static?如果您想共享同一个实例(wordList 等)以从外部类/线程/等访问,则应使用 static,请阅读我附加的有关使用 staticreadonly 的链接。
【解决方案2】:

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

除此之外,使用List&lt;string&gt; 并省去必须来回施法的麻烦。

【讨论】:

    【解决方案3】:

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

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

    同样作为风格问题,您不应该有公共字段。要么将它们设为私有,要么将它们变成属性。您可能还想考虑只公开 getter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多