簡體   English   中英

如何使用 Linq 或 Sort 處理對象列表的排序?

[英]How is ording a List of objects handled with Linq and or Sort?

對不起,如果這是重復的。 我很難找到答案,因為有太多人問我如何在我的搜索結果中對列表進行排序。

假設我有這樣的屬性:

public List<object> Hello { get; set; }

假設列表中的每個元素都具有相同的可為空原始數據類型。

所以每個元素都是一個int? 還是每個元素都是小數? 或者每個元素都是一個日期時間?等

如果我在這個列表上調用 Sort 或 OrderBy 會發生什么? 它是根據每個元素的基礎類型排序還是按屬性的字符串值排序?

讓我們檢查http://ideone.com/kcXmHE

System.ArgumentException: Value does not fall within the expected range.
  at System.String.CompareTo (System.Object value) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Comparer`1+DefaultComparer[System.Object].Compare (System.Object x, System.Object y) [0x00000] in <filename unknown>:0 
  at System.Linq.SortSequenceContext`2[System.Object,System.Object].Compare (Int32 first_index, Int32 second_index) [0x00000] in <filename unknown>:0 
  at System.Array.qsort[Int32] (System.Int32[] keys, Int32 low0, Int32 high0, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Array.SortImpl[Int32] (System.Int32[] keys, Int32 index, Int32 length, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Array.Sort[Int32] (System.Int32[] array, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Linq.QuickSort`1[System.Object].PerformSort () [0x00000] in <filename unknown>:0 
  at System.Linq.QuickSort`1+<Sort>c__Iterator0[System.Object].MoveNext () [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.List`1[System.Object]..ctor (IEnumerable`1 collection) [0x00000] in <filename unknown>:0 
  at System.Linq.Enumerable.ToList[Object] (IEnumerable`1 source) [0x00000] in <filename unknown>:0 
  at Test.Main () [0x00000] in <filename unknown>:0 

因此,LINQ 使用列表元素的默認比較器(對於字符串值,您可以看到System.String.CompareTo )並嘗試與另一個值(對象類型)進行比較。 而且,做不到。

如果您更改初始列表 ( http://ideone.com/foljli ) 中元素的順序,您將獲得另一個堆棧跟蹤:

System.ArgumentException: Object must be of type Int32.
  at System.Int32.CompareTo (System.Object value) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Comparer`1+DefaultComparer[System.Object].Compare (System.Object x, System.Object y) [0x00000] in <filename unknown>:0 
  at System.Linq.SortSequenceContext`2[System.Object,System.Object].Compare (Int32 first_index, Int32 second_index) [0x00000] in <filename unknown>:0 
  at System.Array.qsort[Int32] (System.Int32[] keys, Int32 low0, Int32 high0, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Array.SortImpl[Int32] (System.Int32[] keys, Int32 index, Int32 length, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Array.Sort[Int32] (System.Int32[] array, IComparer`1 comparer) [0x00000] in <filename unknown>:0 
  at System.Linq.QuickSort`1[System.Object].PerformSort () [0x00000] in <filename unknown>:0 
  at System.Linq.QuickSort`1+<Sort>c__Iterator0[System.Object].MoveNext () [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.List`1[System.Object]..ctor (IEnumerable`1 collection) [0x00000] in <filename unknown>:0 
  at System.Linq.Enumerable.ToList[Object] (IEnumerable`1 source) [0x00000] in <filename unknown>:0 
  at Test.Main () [0x00000] in <filename unknown>:0 

現在,LINQ 采用 int32 並嘗試與對象進行比較。 並再次失敗。 因為 int32 類型沒有方法CompareTo(object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM