2016-07-05 12 views
0

Ich habe diese Zeile Code:Gleichheitsvergleich `FindIndex` vs` IndexOf`

int MyIndex = MyListOfCustomObjects.IndexOf(CandidateObject); 
// assume CandidateObject exists in the list 

Jetzt weiß ich, dass List.FindIndex Method:

Sucht nach einem Element, das die Bedingungen von einem definiert wird, entspricht spezifiziertes Prädikat und gibt den nullbasierten Index des ersten Vorkommens innerhalb der Liste oder eines Teils davon zurück.

Ich frage mich, haben alle Objekte einer bestimmten Klasse die gleiche Größe?

Wenn ja, und da, dass es keine angegebene Prädikat mit der IndexOf, was dann Bedingungen sollte für CandidateObject angepasst, um sein in MyListOfCustomObjects gefunden werden?

Auch was ist mit ".. oder ein Teil davon." gemeint?

+2

Ihre Frage ist ein wenig verwirrend. Dein Titel erwähnt "Gleichheitsvergleich", aber nicht den Kern der Frage. Ebenso fragen Sie nach FindIndex, aber Ihr Beispielcode verwendet IndexOf. Das sind zwei verschiedene Methoden ... –

+1

Sie sollten eine Frage pro Frage stellen, nicht mehrere. – Servy

+0

@Mike Ich frage nach "Gleichheitsvergleich" von 'IndexOf'. Wie weiß mein "Beispielcode", welches Objekt die Übereinstimmung ist? –

Antwort

2

Welche Bedingungen müssen übereinstimmen, damit CandidateObject innerhalb von MyListOfCustomObjects gefunden wird?

Die documentation indirekt antwortet, dass:

Diese Methode Gleichheit mit dem Standardgleichheitsvergleich EqualityComparer<T>.Default für T, die Art des Wertes in der Liste bestimmt.

Wenn Sie auf dem Link für EqualityComparer<T>.Default folgen, werden Sie feststellen, dass es ruft entweder die generische Equals(T) Methode für die Klasse definiert (falls vorhanden) oder eine nicht-generische Equals(object) Überlastung. Wenn T keine Methode implementiert/außer Kraft setzt, wird Referenz Gleichheit standardmäßig verwendet, da so object.Equals(object) definiert ist.

Scott hat Ihre Frage zu "..oder einem Teil davon" beantwortet. perfekt, und ich bin mir nicht sicher, was Sie mit "der gleichen Größe" meinen oder was es mit Gleichheit zu tun hat. Es gibt keine Garantie, dass zwei Objekte der gleichen Klasse den gleichen Speicherbedarf haben, wenn Sie das fragen.

1

Alle Objekte benötigen nur einen Index-Slot, sodass Sie sie als "mit derselben Größe" betrachten können.

IndexOf hat kein Prädikat, das Sie definieren können, aber es folgt immer noch eins. Sie können von IndexOf denken, wie implementiert, wie

public int IndexOf(T item) 
{ 
    return this.FindIndex(x => item.Equals(x)); 
} 
public int IndexOf(T item, int startIndex) 
{ 
    return this.FindIndex(startIndex, x => item.Equals(x)); 
} 
public int IndexOf(T item, int startIndex,int count) 
{ 
    return this.FindIndex(startIndex, count, x => item.Equals(x)); 
} 

Die „oder ein Teil davon“ -Teil für ist, wenn Sie die Überlastungen verwenden, die in startIndex nehmen, dies ermöglicht es Ihnen, teilweise in die Liste der Suche zu starten, ab der mitgelieferte Index, anstatt mit 0 zu beginnen. Wenn Sie zum Beispiel den 2. Punkt finden möchten, würden Sie den Index des ersten finden, dann rufen Sie erneut auf dem Ergebnis + 1 auf, um den 2. Index zu finden.