为什么在List <object> .Add(int)时出现错误

时间:2017-09-30 22:09:57

标签: c# list linq generics

我有一个List类型数组:

List<object>[] vector = new List<object>[3];

第一个List包含字符串:

// Get word lists together, remove duplicates
var words = tableA.ToList().Union(tableB.ToList());
// Sort words
words = words.OrderBy(s => s, StringComparer.CurrentCultureIgnoreCase);
// Add words to the vector first slot
vector[0] = words.ToList<object>();

现在,我想在第二个和第三个列表中添加注释,但是我在这里收到错误:

vector[1].Add(tableA.GetValue(keyword));
vector[2].Add(tableB.GetValue(keyword));

GetValue()返回一个int。但是当我将这些内容添加到向量列表时,它会抛出错误:

ERROR Caught: Object reference not set to an instance of an object.

我应该如何向列表中添加注册?或者是否应该使用其他数据结构代替向量?我觉得有一些琐碎的演员我不知道但是我还没有找到解决方案。

3 个答案:

答案 0 :(得分:3)

我不是C#的专家,但我想我明白了。 当你写:

List<object> vector = new List<object>[3];

您创建一个大小为3的List表。 您可以将某些内容放入此数组的每个插槽中,但每个“插槽”在第一行代码后仍然不引用任何实例。 当你写

vector[0] = words.ToList<object>(); 

你把一些东西放到了矢量列表的第一个插槽中。但[1]和[2]仍然是空的。并且

vector[1]

是指未设置为对象实例的引用。简而言之,它指的是什么。

答案 1 :(得分:1)

您必须在添加值之前初始化每个向量索引值。感谢

答案 2 :(得分:1)

撰写var a = new List<object>时,您只声明a是一个包含一些(在您的情况下为三个)项目的列表。但是,您无法确定 这三个元素中的内容。在您使用任何之前,您必须在每个项目中输出一些值(例如,调用任何方法)。

你已经将列表放入第一个项目,但索引1和2上的元素在调用如下方法时仍然为null NullReferenceException

vector[1].Add(...);

所以你应该在索引oe和之前初始化值:

vector[1] = new List<int>();
vector[2] = new List<int>();

但是你仍然不能对列表做很多事情,因为它的类型为object,所以你必须将每个元素都转换为实际的类型:

((List<int>)vector[1]).Add(myInt);

无论如何,我怀疑在一个单独的列表中存储三个完全不同的列表是一个好主意。也许您应该定义一个以三个列表为成员的类:

class MyClass
{
    public List<string> Words { get; set; }
    public List<int> NumbersA { get; set; }
    public List<int> NumbersB { get; set; }
}