Он хорошо работает в сочетании с нулевым индексированием и len ()
. Например, если у вас есть 10 элементов в списке x
, они пронумерованы 0-9. range (len (x))
дает вам 0-9.
Конечно, люди скажут вам, что это больше Pythonic для для элемента в x
или для индекса, item в перечислении (x)
, а не для i в диапазоне (len (x))
.
Нарезка тоже работает так: foo [1: 4]
- это пункты 1-3 из foo
(имея в виду, что элемент 1 на самом деле является вторым элементом из-за индексации на основе нуля). Для согласованности они должны работать одинаково.
Я думаю, что это: «первое число, которое вы хотите, за которым следует первое число, которое вы не хотите ». Если вы хотите 1-10, первое число, которое вам не нужно, равно 11, поэтому это диапазон (1, 11)
.
Если он становится громоздким в конкретном приложении, достаточно легко написать небольшую вспомогательную функцию, которая добавляет 1 к концу индекса и вызывает range ()
.
Извините, нет встроенной реализации классов в C #. Есть только Анонимные типы , но они не поддерживают добавление интерфейсов (см., Например, Может ли анонимный класс C # реализовать интерфейс? ) (и они не поддерживают методы добавления или поля ... Они поддерживают только свойства).
Вы можете использовать методы System.Reflection.Emit
для создания класса во время выполнения, но это длинный и утомительный.
Это довольно распространено в java, но вы не можете сделать это на C #. Вы можете передавать функции или процедуры в качестве параметров:
public void myMethod(Action act)
{
act();
}
myMethod( () => Console.WriteLine("yay") );
Существует несколько (общая) версия действия (процедура с параметрами и без возвращаемого значения) и Func (функции с параметрами и возвращаемым значением).
Вы можете создать класс, который обертывает Action
и реализует этот интерфейс:
public sealed class SomeAction : ISomeInterface
{
Action action;
public SomeAction (Action action) { this.action = action; }
public void DoIt() { this.action(); }
}
Это позволяет использовать его следующим образом:
object.myMethod(new SomeAction(() => Console.WriteLine("yay"));
Это конечно, очень практично, если вы собираетесь повторно использовать SomeAction
, но это, вероятно, самое удобное решение.
Ищите пакет NuGet «ImpromptuInterface». С помощью комбинации этого пакета и ExpandoObject вы можете сделать что-то вроде этого
//Create an expando object and create & assign values to all the fields that exists in your interface
dynamic sigObj = new ExpandoObject();
sigObj.EmployeeKey = 1234;
//Create the object using "ActLike" method of the Impromptu class
INewSignatureAcquired sig = Impromptu.ActLike<INewSignatureAcquired>(sigObj);
void
), вместо этого примитеAction
. – Patryk Ćwiek 6 September 2013 в 11:42