我遇到代理人没有委托的问题...... 我有一个名为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个元素。
我也尝试过逆转twt1
和twt2
,但没有任何区别。
我也尝试在Tweet类中创建自己的比较方法,但同样的事情。
任何帮助将不胜感激!
此外,我不认为这是这个问题的重复:List.Sort in C#: comparer being called with null object 因为我尝试了所有可能的解决方案,但它不起作用。我也在谷歌搜索了很多:(
答案 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
将不会遇到任何问题。