def chunk(input, size):
return map(None, *([iter(input)] * size))
Во-первых, я не уверен, разумно ли использовать IComparable
с перечислением ... IEquatable
, конечно - но сравнение?
Как более безопасная альтернатива; вместо того, чтобы назначать IComparable
общим ограничением, возможно, используйте Comparer
внутри класса. Это имеет то преимущество, что поддерживает IComparable
и IComparable
- и это означает, что у вас меньше ограничений для распространения.
Например:
public class SomeClass<T> { // note no constraint
public int ExampleCompareTo(T other) {
return Comparer<T>.Default.Compare(Stored, other);
}
... [snip]
}
Это отлично работает с перечислением :
SomeClass<TestVal> t = new SomeClass<TestVal>();
t.Stored = TestVal.First;
int i = t.ExampleCompareTo(TestVal.Second); // -1
Перечисления не являются производными от System.Int32s - они являются производными от System.Enum, который не реализует IComparable
(он реализует IComparable
.
Хотя базовым значением перечисления по умолчанию является int, само перечисление - нет. Таким образом, между ними нет преобразования.
В перечислениях C # реализуйте IComparable
, но не общий IComparable
. Я не уверен, почему это так, но, возможно, вы могли бы переключиться на неуниверсальный IComparable
в своем предложении where.
Enum не реализует IComparable
, но реализует IComparable
. Таким образом, перечисление может быть буквой T в предложении where, например:
where T : IComparable
, но это дает ошибку:
where T : IComparable<T>
И тогда, я полагаю, вы хотите, чтобы SomeClass был сопоставимым. Для этого потребуется реализовать сам IComparable.
Вот пример того и другого (с использованием публичного члена для упрощения кода):
public class SomeClass<T>
: IComparable<SomeClass<T>>
where T : IComparable
{
public T storedval;
public int CompareTo(SomeClass<T> other)
{
return storedval.CompareTo(other.storedval);
}
}