Int32? с IComparable

Можно всегда использовать свойство "DocumentStream" или "DocumentText". Для работы с документами HTML я рекомендую Пакет Гибкости HTML .

10
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

Nullable может не реализовывать IComparable , но наверняка int реализует. И Nullable всегда помещается в T (например, при приведении к интерфейсу, например IComparable , который является преобразованием бокса). Так что сравнение / сортировка свойств, допускающих значение NULL, не должно быть проблемой.

int? value = 1;
IComparable comparable = value; // works; even implicitly

Итак, проверка в примере вверху не работает должным образом. Попробуйте следующее:

Type interfaceType = prop.PropertyType.GetInterface("IComparable");
// Interface not found on the property's type. Maybe the property was nullable?
// For that to happen, it must be value type.
if (interfaceType == null && prop.PropertyType.IsValueType)
{
    Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);
    // Nullable.GetUnderlyingType only returns a non-null value if the
    // supplied type was indeed a nullable type.
    if (underlyingType != null)
        interfaceType = underlyingType.GetInterface("IComparable");
}
if (interfaceType != null)
   // rest of sample

Еще одно дополнение: если вы хотите, чтобы значения NULL также работали (как строковые, так и типы, допускающие значение NULL), вы можете попробовать эту повторную реализацию SortCore (...) :

protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
    IEnumerable<MyClass> query = base.Items;
    if (direction == ListSortDirection.Ascending)
        query = query.OrderBy( i => prop.GetValue(i) );
    else
        query = query.OrderByDescending( i => prop.GetValue(i) );
    int newIndex = 0;
    foreach (MyClass item in query)
    {
        this.Items[newIndex] = item;
        newIndex++;
    }
    this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}

Нет необходимости искать IComparable напрямую, просто позвольте методам сортировки разобраться в этом.

11
ответ дан 3 December 2019 в 22:38
поделиться

При сравнении типов, допускающих значение NULL, можете ли вы сделать что-то вроде этого ...

Int32? val1 = 30;
Int32 val2 = 50;

Int32 result = (val1 as IComparable).CompareTo(val2);
4
ответ дан 3 December 2019 в 22:38
поделиться