如果对此的回答很明显,我很抱歉,我对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();
}
答案 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)
你可以发布添加列表的代码 - 我打赌你正在做类似
的事情这导致单个对象(因为你只创建了一次)有多个引用,即来自_WordList中的第一个值,来自_WordList中的第二个值,来自l。
所以正确的做法是:
或代码:
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();
}
}