【问题标题】:Why do I get an error when List<object>.Add(int)为什么 List<object>.Add(int) 时出现错误
【发布时间】:2018-03-12 11:02:36
【问题描述】:

我有一个列表类型数组:

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() 返回一个整数。但是当我将这些整数添加到向量列表中时,它会引发错误:

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

我应该如何将整数添加到列表中?或者我应该使用其他一些数据结构来代替向量吗?我觉得我缺少一些琐碎的演员表,但我一直找不到解决方案。

【问题讨论】:

  • 这东西还能编译吗?
  • 是的,它已编译
  • List 向量 = new List[3];编译???
  • 哦,我在写问题时忘记了 []。列表[] 向量 = 新列表[3]; **
  • -3 代表你的 stackoverflow 的合法问题

标签: c# list linq generics


【解决方案1】:

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

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

你创建了一个大小为 3 的 List 表。 你可以在这个数组的每个槽中放一些东西,但是每个“槽”在第一行代码之后仍然没有引用任何实例。 当你写

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

你把一些东西放入向量列表的第一个槽。但是 [1] 和 [2] 仍然是空的。还有

vector[1]

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

【讨论】:

  • 所以至少将 vector[1] & vector[2] 设置为一个空列表。例如vector[1] = new List();
  • 关于 c# 的假设是正确的。该数组具有索引 1 和 2 的两个空值。
  • List 向量 = new List[3];甚至不编译。
  • 没错,史蒂文所说的解决了它。 Anthansos,这是错字,我认为我的意思仍然很明显
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在编写var a = new List&lt;object&gt; 时,您只是声明a 是一个包含一些(在您的情况下为三个)项目的列表。但是,您无法确定这三个元素 中是什么。您必须在每个项目中输出一些值,然后才能使用它anything(例如调用任何方法)。

    您已经将列表放入第一项,但是索引一和二上的元素仍然为 null,从而在调用如下方法时导致 NullReferenceException

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

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

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

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

    ((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; }
    }
    

    【讨论】:

    • 不需要强制转换,这就是我想要对象列表的原因。这只是一个单一的余弦向量相似度计算,所以我不想为一个计算创建一个完整的类。但你是对的,我只需要这两行:vector[1] = new List();和vector[2] = new List();.
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多