【问题标题】:array comparison(T) delegate NullReferenceException数组比较(T)委托 NullReferenceException
【发布时间】:2014-07-24 11:16:28
【问题描述】:

我遇到了代表未授权的问题... 我有一个名为 Tweet 的对象,它有一个字符串文本和一个 int 分数。我想按分数的顺序对推文对象数组(twtArray)进行排序。 这是我的代码:

Array.Sort(twtArray, delegate(Tweet twt1, Tweet twt2)
        {
            return twt1.score.CompareTo(twt2.score); //(twt1.score - twt2.score)
        });

它抛出:

System.NullReferenceException:对象引用未设置为对象的实例。 在 System.Array.FunctorComparer`1.Compare(T x, T y)

在调试时,我注意到第一个比较有效,但在第二个比较中,twt2 为空。它不能为空,因为我在数组中肯定有 8 个元素。 我也尝试过反转twt1twt2,但没有区别。 我也尝试在 Tweet 类中创建自己的比较方法,但同样的事情。 任何帮助将不胜感激!

另外,我不认为这是这个问题的重复:List.Sort in C#: comparer being called with null object 因为我尝试了所有可能的解决方案,但它不起作用。我也在谷歌上搜索了很多:(

【问题讨论】:

  • 即使您有一个包含 8 个元素的 Tweet[],它们也可以为空:Tweet[] twtArray = new Tweet[8];
  • 我的意思是 Tweet[] 的大小为 20,我可以看到在我的代码的第一行中有 8 个 Tweet 对象(具有正确的文本和分值)。

标签: c# delegates comparison nullreferenceexception


【解决方案1】:

即使您有一个包含 8 个元素的 Tweet[],也可以是 null

Tweet[] twtArray = new Tweet[8]; // all instances are null

你:Tweet[] 的大小为 20,我可以看到在我的代码的第一行中有 8 个 Tweet 对象(带有正确的文本和分值)。 p>

所以数组的大小是 20 但只初始化了 8 个? (看上面) Array.Sort 需要与所有其他人进行比较。

你可以通过这种方式阻止它:

Array.Sort(twtArray, delegate(Tweet twt1, Tweet twt2)
{
    if(twt1 == null && twt2 == null) return 0;
    if(twt1 == null) return -1;
    if(twt2 == null) return  1;
    return twt1.score.CompareTo(twt2.score); 
});

【讨论】:

    【解决方案2】:

    当您使用仅部分填充的数组时,这表明您实际上并不需要数组,您需要List<T>

    使用它,您可以拥有一个包含 8 个项目的集合,但以后可以有效地扩展到 20 个。而且,当您在此类列表中调用Sort() 时,nulls 不会有任何问题。

    【讨论】:

    • 多么真实。有点尴尬没有早点意识到这一点......:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2012-03-18
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多