当我向List <list <string>&gt;添加新项目时父列表的每个项都获得相同的值</list <string>

时间:2011-07-17 11:04:30

标签: c# generic-list

如果对此的回答很明显,我很抱歉,我对C#和OOP还不熟悉。我已经介入了我的代码,并花了很长时间在谷歌上,但我找不到我的问题的答案(很可能是因为我使用了错误的搜索条件!)。

我有以下创建静态List<List<string>>的类,并且有一个方法可以将项添加到该列表中:

public static class WordList
    {
    static List<List<string>> _WordList; // Static List instance

    static WordList()
    {
        //
        // Allocate the list.
        //
        _WordList = new List<List<string>>();
    }

    public static void Record(List<string> Words)
    {
        //
        // Record this value in the list.
        //
        _WordList.Add(Words);
    }
}

在我创建List<string>的位置,我将其传递到Record()方法以添加到_WordList。问题是当我向WordList添加项目时,它会为该列表中的每个项目提供相同的值。 e.g:

添加的第一项包含“Foo”和“bar”

添加的第2项包含“Not”,“Foo”和“bar”

因此,而不是看起来像的列表:

1: "Foo","bar"
2: "Not","Foo","bar"

我最终得到了:

1: "Not","Foo","bar"
2: "Not","Foo","bar"

我没有使用List<string[]>而不是List<List<string>>,因为我要添加List<string>的方式是逐行读取文本文件,并用分隔符说明我应该添加List<string>并清除它,以便我可以重新开始。因此,我不知道我需要声明的数组有多长。

希望这有一定道理!如果您需要更多的代码发布,以帮助告诉我。

提前谢谢。

修改

以下是传递给List<string>方法的Record()创建代码。我想我看到人们所说的关于不创建List<string>的新实例的内容,但我不确定如何根据我的代码来解决这个问题。如果我拿出一个,我会考虑一下并发一个答案!

public static void LoadWordList(string path)
    {
        string line;
        List<string> WordsToAdd = new List<string>();

        StreamReader file = new System.IO.StreamReader(path);
        while ((line = file.ReadLine()) != null)
        {
            if (line.Substring(0, 1) == "$")
            {
                    WordList.Record(WordsToAdd);
                    WordsToAdd.Clear();
                    WordsToAdd.Add(line.Replace("$", ""));
            }
            else
            {
                WordsToAdd.Add(line.Replace("_"," "));
            }
        }
        file.Close();
    }

4 个答案:

答案 0 :(得分:4)

而不是

WordList.Record(WordsToAdd);
WordsToAdd.Clear();
WordsToAdd.Add(line.Replace("$", ""));

DO

WordList.Record(WordsToAdd);
WordsToAdd = new List<string>();
WordsToAdd.Add(line.Replace("$", ""));

答案 1 :(得分:3)

你可以发布添加列表的代码 - 我打赌你正在做类似

的事情
  1. 创建一个列表l
  2. 添加
  3. 修改l
  4. 添加
  5. 这导致单个对象(因为你只创建了一次)有多个引用,即来自_WordList中的第一个值,来自_WordList中的第二个值,来自l。

    所以正确的做法是:

    1. 创建列表l
    2. 添加
    3. 创建新列表l
    4. 添加
    5. 或代码:

      List<string> l = new string[] { "Foo", "bar" }.ToList();
      WordList.Record(l);
      l = new string[] { "Not", "Foo", "bar" }.ToList();
      WordList.Record(l);
      

答案 2 :(得分:3)

您的Record方法所做的就是添加对您传递给它的List<string>的引用。然后清除相同的列表,并开始向其添加不同的字符串。

可能是这样的:

public static void Record(IEnumerable<string> Words)
{
    _WordList.Add(Words.ToList());
}

这将迫使副本发生;另外,通过接受IEnumerable<string>,它对调用它的代码的限制较少。

答案 3 :(得分:1)

您尚未显示如何将项目添加到列表中。这是一个按预期工作的例子:

using System;
using System.Collections.Generic;
using System.Linq;

public static class WordList
{
    static List<List<string>> _WordList; // Static List instance

    static WordList()
    {
        _WordList = new List<List<string>>();
    }

    public static void Record(List<string> Words)
    {
        _WordList.Add(Words);
    }

    public static void Print()
    {
        foreach (var item in _WordList)
        {
            Console.WriteLine("-----");
            Console.WriteLine(string.Join(",", item.ToArray()));
        }
    }
}

class Program
{
    static void Main()
    {
        WordList.Record(new[] { "Foo", "bar" }.ToList());
        WordList.Record(new[] { "Not", "Foo", "bar" }.ToList());

        WordList.Print();
    }
}