2012-01-10 117 views
2

我有一個對象模型MyObject,它包含一個可爲空的字節作爲其屬性之一。 如何對此關鍵字上的MyObjects列表進行排序,以便根據此屬性的值以升序對列表進行排序,最後出現null的對象。使用LINQ排序具有空屬性的對象的列表

感謝您的建議。

+0

默認情況下,nullables地方比較器'null'第一(小於一切),所以你會需要定製'IComparer '。 – 2012-01-10 20:37:07

+0

可能的重複[C# - IComparer - 如果日期時間爲空,那麼應該排序到底部而不是頂部](http://stackoverflow.com/questions/4734055/c-sharp-icomparer-if-datetime-is-null - 然後應該被分類到底部 - 否) – 2012-01-10 20:37:29

回答

9

Linqs OrderBy帶有過載,接受IComparer。通過這種方式,您可以將所有對象按您想要的方式排序。

簡單的例子:

public class NullByteComparer : IComparer<byte?> 
{ 
    public int Compare(byte? a, byte? b) 
    { 
     if (a == b) 
      return 0; 
     if (a == null) 
      return 1; 
     if (b == null) 
      return -1; 
     return return a < b ? -1 : 1; 
    } 
} 

使用它

yourObjects.OrderBy(x => x.NullByteProperty, new NullByteComparer()); 
3

創建IComparer<byte?>接口的自定義實現。

1

使用??運營商強制null值後,像這樣:

var res = myList.OrderBy(v => (uint?)v.NullableByteProp ?? uint.MaxValue); 

你需要轉換爲uint? ,否則你的空值將會排序r與你的0xFFs。

+1

這將創建一個序列,255和空值的值將散佈在最後。 – phoog 2012-01-10 20:37:27

+0

@phoog是的,我也注意到了,並且很快添加了一個修復:) – dasblinkenlight 2012-01-10 20:38:52

1

可以使用GetValueOrDefault()函數來提供一個值時,空等於Byte.MaxValue

var orderedValues = values.OrderBy(v => v.GetValueOrDefault(Byte.MaxValue)); 
+0

這也會創建一個序列,255和空值的值將在最後散佈。 – phoog 2012-01-10 20:38:57

+0

這與@ dasblinkenlight的解決方案非常相似。我記得他的答案(使用合併運算符而不是GetValueOrDefault)對LINQ-to-Entities更友好一點,儘管它更容易轉換爲SQL。 – Reddog 2012-01-10 20:39:20

相關問題