2017-11-14 4 views
1

Ich habe ein Array von einigen ArtenSortieren eine Liste von einer benutzerdefinierten Reihenfolge

private string[] linkTypes = { 
    "dog", 
    "cat", 
    // and so on .. 
}; 

Ja, ich ein enum aber in diesem Fall verwenden könnte hat es eine Reihe von Strings sein.

So, jetzt habe ich eine Liste der Objekte als "Linkelement"

private List<LinkElement> links = new List<LinkElement>(); 

und diese Objekte haben eine String-Eigenschaft namens "Typ"

string linkType = links[index].Type; 

Wenn Linktypes, die Elemente enthält " Hund "und" Katze ", meine Links können nur" Hund "oder" Katze "als ihren Typ haben.

Ich möchte die Liste "Links" in der Reihenfolge der LinkTypes sortieren.

Bedeutet die Listen Reihenfolge enthält die Links mit dem Typ "Hund" zuerst und danach die Links mit dem Typ "Katze" kommen.

List<LinkElement> sortedLinks = ; // sort links 

for (int i = 0; i < sortedLinks.Count; i++) 
{ 
    LinkElement currentLink = sortedLinks[i]; 
    Console.WriteLine(currentLink.Type); 
} 

// Write down dogs first, cats after 

Kann mir jemand helfen?

Antwort

4

linkTypes (die private String-Array) Unter der Annahme, ist in der gleichen Klasse wie links (die Liste der LinkElement) können Sie LINQ OrderBy mit einem einfachen Lambda-Ausdruck verwenden:

var sortedLinks = links.OrderBy(le => Array.IndexOf(linkTypes, le.linkType)).ToList() 
+0

Ja, das ist gut, aber hier fehlt ein Argument 'IndexOf (le.linkType)) ' – Question3r

+0

Entschuldigung, Code wurde direkt hier geschrieben und nicht getestet. Jetzt behoben. –

+0

ja, das ist es :) – Question3r

0

Vergleiche wie "alphabetische Reihenfolge" (String) "größere Zahl" (numerische Typen) usw. werden mit der IComparable-Schnittstelle durchgeführt. Sie können diese Schnittstelle in Ihrer benutzerdefinierten Klasse implementieren, damit Instanzen sich selbst nach Belieben sortieren können. Informieren Sie sich über die Schnittstelle hier:

https://msdn.microsoft.com/en-us/library/4d7sx9hd(v=vs.110).aspx

Wenn Sie eine feste Anzahl von Typen haben, dann könnten Sie eine schnelle Hilfsmethode verwenden, um eine ganze Zahl für jedes Objekt zurück auf seine Art abhängig, und vergleichen Sie die zurückgegebenen Zahlen von jedem Objekt zu bestimmen, welches "zuerst kommt".

+0

Dies ist eine gute Idee im Allgemeinen, aber wahrscheinlich mehr als für diese Situation zu töten. –

+0

Früher habe ich ziemlich viele davon geschrieben, aber da wir LINQs OrderBy haben, kann ich mich nicht erinnern, auch nur einen einzigen Vergleich geschrieben zu haben. Zugegebenermaßen ist die Verwendung von LINQ möglicherweise etwas langsamer als andere Methoden, aber wenn Sie ein echtes Leistungsproblem haben und dessen Ursache als die Verwendung von OrderBy identifizieren können, wen interessiert das? –

0

Implementieren entweder die IComparer oder dem IComparable Schnittstelle. Der Nachteil der Verwendung der IComparable ist, dass dies von der Klasse implementiert werden muss, die zum Sortieren vorgesehen ist, was bedeutet, dass Sie dies nicht anderweitig verwenden können, wenn Sie es anderswo in Ihrem Code sortieren möchten Mechanismus. Auf der anderen Seite kann IComparer von der Zielklasse entkoppelt und auf mehrere Arten implementiert werden, wenn Sie dies wünschen. Abhängig von den Sortierkriterien in verschiedenen Teilen Ihrer Anwendung können Sie je nach Bedarf eine dieser IComparer Klassen anwenden.

https://support.microsoft.com/en-us/help/320727/how-to-use-the-icomparable-and-icomparer-interfaces-in-visual-c

Verwandte Themen