繁体   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