2012-01-10 4 views
2

У меня есть объектная модель MyObject, которая содержит нулевой байт как один из его свойств. Как отсортировать список MyObjects на этом ключе, чтобы список упорядочивался по возрастанию в зависимости от значений этих свойств, с объектами, которые имеют значение null, которое появляется последним.сортировка списка объектов с нулевыми свойствами с использованием linq

Спасибо за ваши предложения.

+0

По умолчанию компаратора для nullables мест 'null' первый (меньше всего), таким образом, вы бы нужен пользовательский IComparer '. –

+0

Возможный дубликат [C# - IComparer - Если datetime равно null, то его следует сортировать снизу не вверху) (http://stackoverflow.com/questions/4734055/c-sharp-icomparer-if-datetime-is-null -then-should-be-sorted-to-the-bottom-no) –

ответ

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 с 0xFF.

+1

Это создаст последовательность, в которой значения 255 и нулевые значения будут вкраплены в конце. – phoog

+0

@phoog Да, я тоже это заметил и быстро добавил исправление :) – dasblinkenlight

1

Вы можете использовать() функцию GetValueOrDefault, чтобы обеспечить значение, когда нуль равно Byte.MaxValue

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

Это также создаст последовательность, в которой в конце будут помечены значения 255 и нулевые значения. – phoog

+0

Это почти идентично решению @ dasblinkenlight. Я помню, что его ответ (с использованием коалесцирующего оператора вместо GetValueOrDefault) немного больше LINQ-to-Entities, хотя в нем он более легко переводится на SQL. – Reddog

Смежные вопросы