none
Sort()方法使用System.Comparison<T>委託 RRS feed

  • 問題

  • Sort()方法使用的範例讓我看不太懂,有一些問題

    他說Sort有默認比較器與指定比較器,當需要根據某些自訂類型的某個或者某幾個值進行排序時,默認比較器就無法滿足要求,

    我試了以下範例改成默認方法sampleList.Sort()的確會出錯,但使用try,catch方法輸出只回錯誤說"無法比較陣列中兩個元素"。

                List<SampleValue> sampleList = new List<SampleValue>(10);
                sampleList.Add(new SampleValue { Value = 6 });
                sampleList.Add(new SampleValue { Value = 2 });
                sampleList.Add(new SampleValue { Value = 1 });
                sampleList.Add(new SampleValue { Value = 8 });

                sampleList.Sort(delegate(SampleValue x,SampleValue y)
                {
                    if(x==null)
                    {
                        if(y==null)
                        {
                            return 0;
                        }
                        else
                        {
                            return -1;
                        }
                    }
                    else
                    {
                        if(y==null)
                        {
                            return 1;
                        }
                        else
                        {
                            return x.Value.CompareTo(y.Value);
                        }
                    }
                });

    /////////////下面是Sort默認比較器,會回報錯誤"無法比較陣列中兩個元素"/////////////          

                try
                {
                    sampleList.Sort();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }

    然後我使用之前方法新增元素,就可以用Sort();進行排序。

                List<int> aa = new List<int>(10);
                aa.Add(5);
                aa.Add(3);
                aa.Add(8);
                aa.Add(4);
                foreach (int val in aa)
                {
                    Console.Write("\t{0}", val);
                }
                aa.Sort();
                foreach (int val in aa)
                {
                    Console.Write("\t{0}", val);
                }

    我問題是

    1.直接用Add(5);增加集合中的元素跟Add(new SampleValue { Value = 6 });這樣的方法增加元素有什麼不一樣?

    2.為什麼Sort默認比較器可以排序第一種集合內的元素, 但卻不能排序第二種方法中集合的元素?

    3.程式中有當x跟y都是null時,return 0;但是我把元素改成null時,像Add(new SampleValue { Value = null });會編譯錯誤說int是non-nullable屬性,那x跟y怎麼會有等於null時的狀況發生?

    2011年10月30日 下午 03:29

解答

所有回覆