Предполагая, что все спускается с object
(вы сами по себе, если это не так), Python вычисляет порядок разрешения метода (MRO) на основе вашего дерева наследования класса. MRO удовлетворяет 3 свойствам:
Если такой порядок не существует, ошибки Python. Внутренняя работа - это C3-линеризация родословных классов. Подробнее читайте здесь: https://www.python.org/download/releases/2.3/mro/
Таким образом, в обоих приведенных ниже примерах это:
Когда метод вызванное, первое вхождение этого метода в MRO - это тот, который вызывается. Любой класс, который не реализует этот метод, пропускается. Любой вызов super
внутри этого метода вызовет следующее вхождение этого метода в MRO. Следовательно, это имеет значение как в том порядке, в котором вы размещаете классы в наследовании, так и там, где вы помещаете вызовы в super
в методах.
super
сначала в каждом методе class Parent(object):
def __init__(self):
super(Parent, self).__init__()
print "parent"
class Left(Parent):
def __init__(self):
super(Left, self).__init__()
print "left"
class Right(Parent):
def __init__(self):
super(Right, self).__init__()
print "right"
class Child(Left, Right):
def __init__(self):
super(Child, self).__init__()
print "child"
Child()
Выходы:
parent
right
left
child
super
последним в каждом методе class Parent(object):
def __init__(self):
print "parent"
super(Parent, self).__init__()
class Left(Parent):
def __init__(self):
print "left"
super(Left, self).__init__()
class Right(Parent):
def __init__(self):
print "right"
super(Right, self).__init__()
class Child(Left, Right):
def __init__(self):
print "child"
super(Child, self).__init__()
Child()
Выходы:
child
left
right
parent
Каждый метод, упомянутый ранее, делает цикличное выполнение или внутренне или внешне, таким образом, не действительно важно, как реализовать его. Здесь другой пример нахождения всех ссылок целевой строки
string [] arr = {"One","Two","Three"};
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
Это должна быть строка []? List< String> дал бы Вам, в чем Вы нуждаетесь.
List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
Если массив отсортирован, можно использовать BinarySearch. Это - O (зарегистрируйте n), операция, таким образом, это быстрее как цикличное выполнение. Если необходимо применить несколько поисков, и скорость является беспокойством, Вы могли бы отсортировать ее (или копия) перед использованием ее.
Почему запрет "Я не хочу использовать какое-либо цикличное выполнение"? Это - самое очевидное решение. При давании шанса быть очевидным возьмите его!
Примечание, которое звонит как arr.Contains(...)
, все еще идет в цикл , это просто не будете Вы, кто записал цикл.
Вы рассмотрели альтернативное представление, это более поддается поиску?
arr
отсортирован, Вы могли использовать двоичный поиск (который должен будет рекурсивно вызвать или цикл, но не так часто как прямой линейный поиск). Ну, что-то оказывается перед необходимостью смотреть, и цикличное выполнение более эффективно, чем рекурсия (так как рекурсия хвоста не полностью реализована)... поэтому, если Вы просто не хотите циклично выполнять себя, затем любой из:
bool has = arr.Contains(var); // .NET 3.5
или
bool has = Array.IndexOf(arr, var) >= 0;
Для получения информации: избегают имен как var - это - ключевое слово в C# 3.0.
В первом выстреле я мог придумать что-то вроде этого (но это - псевдо код и предположение, что Вы не можете использовать.NET встроенный libaries). Мог бы потребовать небольшого количества тонкой настройки и пересмотра прежнего мнения, но должен быть достаточно хорошим для преимущества, возможно?
int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
{
if currentIndex > stringMaxIndex
return (-stringMaxIndex-1);
else if var==arr[currentIndex] //or use any string comparison op or function
return 0;
else
return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
}
//calling code
int index = findString(var, arr, 0, getMaxIndex(arr));
if index == -1 printOnScreen("Not found");
else printOnScreen("Found on index: " + index);
Каждый класс, реализовывая IList имеет метод , Содержит (Объектное значение) . И Система - также. Массив.
В C#, если можно использовать ArrayList, можно использовать, Содержит метод, который возвращает булевскую переменную:
if MyArrayList.Contains("One")
Я считаю, что лучше использовать Array.Exists , чем Array.FindAll .