数组比较(T)委托NullReferenceException

时间:2014-07-23 12:01:59

标签: c# delegates comparison nullreferenceexception

我遇到代理人没有委托的问题...... 我有一个名为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为空。并且它不能为null,因为我在数组中肯定有8个元素。 我也尝试过逆转twt1twt2,但没有任何区别。 我也尝试在Tweet类中创建自己的比较方法,但同样的事情。 任何帮助将不胜感激!

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

2 个答案:

答案 0 :(得分:3)

即使你有一个包含8个元素的Tweet[],有些也可能是null

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

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

所以数组的大小是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); 
});

答案 1 :(得分:1)

当您使用仅部分填充的阵列时,表示您实际上并不想要阵列,您需要List<T>

使用它,您可以拥有一个包含8个项目的集合,但稍后可以有效地扩展到20个项目。当您在此类列表上致电Sort()时,您null将不会遇到任何问题。