![]() |
Objektliste sortieren
Hat noch jemand eine Idee, wie man diese Sortierung besser machen kann? Gehört mit zum gleichen Thema, darum packe ich´s mal mit hier rein:
Code:
Hintergrund: Die Ergebnisse der Hilfe kommen als so genannte IHxTopicList zurück, durch die man sich zwar schön mit foreach durchloopen kann, allerdings sind die Einträge auch nicht sortiert. Ich habe ehrlich gesagt noch nicht probiert, ob man diese Liste sortieren kann. Der Reflector meint
private List<IHxTopic> SortTopics(IHxTopicList topics)
{ List<IHxTopic> result = new List<IHxTopic>(); try { if(topics != null && topics.Count > 0) { foreach(IHxTopic topic in topics) { if(!result.Contains(topic)) result.Add(topic); } TopicComparer topicComparer = new TopicComparer(); result.Sort(topicComparer); } } catch {} return result; } class TopicComparer : IComparer<IHxTopic> { public int Compare(IHxTopic x, IHxTopic y) { int result = CompareType("kbSyntax", x, y); if(result == 0) result = CompareType("kbHowTo", x, y); if(result == 0) result = CompareType("kbArticle", x, y); return result; } private int CompareType(string topicType, IHxTopic x, IHxTopic y) { if(x.HasAttribute("TopicType", topicType) && !y.HasAttribute("TopicType", topicType)) return -1; else if(y.HasAttribute("TopicType", topicType) && !x.HasAttribute("TopicType", topicType)) return 1; else return 0; } }
Code:
@Robert: :gruebel:
public interface IHxTopicList : IEnumerable
Na ja, egal. Ich habe das jetzt also mal in eine Liste geschoben und einen IComparer benutzt, mit dem sich eigentlich schön sortieren lässt. Ich bin nur nicht so ganz glücklich über den Weg, denn wir ihr seht, vergleiche ich 3 verschiedene Attribute. So werden eben Syntaxbeispiele zuerst angezeigt, dann kommen How-tos, dann kommen Artikel, und erst dann kommen alle Hilfethemen mit sonstigen Attributen. Aber mal abgesehen davon, Robert, ich kann deine Vorliebe für´s .NET Framework gut verstehen. :drunken: btw: Welche Bedeutung hat eigentlich yield? Ich werde aus der Erklärung im Framework nicht so recht schlau. :oops: |
Re: Herkunft von Methoden/Properties ermitteln
yield ist das keyword, dass mit den iteratoren eingeführt wurde.
Iteratoren geben dir die Möglichkeit durch eine in der Art nicht existierende oder für die benutzende Klasse zugängliche Liste zu iterieren. Innerhalb des iterators entspricht jedes yield einem neuen Datensatz, den der aufrufende Enumerator bekommt. beispiel:
Delphi-Quellcode:
uses
System.Collections.*; type MyStringCollection = public class(List<String>) public method StartsWith(firstLetters : String) : IEnumerable<String>; iterator; end; implementation method MyStringCollection.StartsWith(firstLetters : String) : IEnumerable<String>; begin for Item : String in ToArray() do if Item.StartsWith(firstLetters) then yield (Item); end;
Delphi-Quellcode:
class method ConsoleApp.Main;
begin var list := new MyStringCollection(); list.Add('Hallo'); list.Add('Miep'); list.Add('Mjsfwwoif'); list.Add('grghth'); list.Add('Mieifrjg'); list.Add('Hallihallo'); for Item : String in list.StartsWith('M') do Console.WriteLine(Item); Console.ReadLine(); end; Output Miep Mjsfwwoif Mieifrjg Btw: Davon hier wird mir ganz schlecht! Zitat:
(Manchmal will dein AddIn die hXs aktualisieren, wenn ich #d schließe. :shock:) Mit der Sortierung machst du mal lieber einen neuen thread auf und postest das Interface von dem HxiDings... ;) |
Re: Herkunft von Methoden/Properties ermitteln
Zitat:
Zitat:
|
Re: Herkunft von Methoden/Properties ermitteln
Zitat:
Nur Exceptions, die du kennst und von denen dur weißt, dass Help2 sie wegen XYZ wirft kannst du schlucken. Andere müsstest du wohl durchschleifen. Exceptions, deren Ursprung oder Auswirkung dir nicht bekannst ist darfst du keinesfalls ( :!: ) schlucken. |
Re: Objektliste sortieren
Okay, okay, ... ich habe ein paar MessageBoxen eingebaut. Ich sehe die nur nie, :stupid:, ganz so übel scheint mein Code also gar nicht zu sein. :mrgreen:
Könnten wir uns nun wieder der Sortierung widmen? Äh, was wolltest du? Was soll ich posten? :gruebel: |
Re: Objektliste sortieren
Okay, hier ist die Deklaration von IHxTopicList. Kann man so was auch direkt sortieren?
Code:
Das "Dumme" in meinem Fall ist eben, dass ich 3 verschiedene Attribute habe. "kbSyntax", "kbHowTo" und "kbArticle". Themen mit diesen Attributen sollen zuerst kommen. Danach der Rest. Aus dem Grund mein voriger Ansatz. Unglücklicherweise ist das Help 2.0-API ja auch undokumentiert, so dass ich nicht weiß, ob die int-Variable bei
[ComImport, Guid("31411194-A502-11D2-BBCA-00C04F8EC294"), DefaultMember("Item"), TypeLibType((short) 0x10c0)]
public interface IHxTopicList : IEnumerable { [return: MarshalAs(UnmanagedType.Interface)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0)] IHxTopic Item([In, MarshalAs(UnmanagedType.Struct)] object index); [return: MarshalAs(UnmanagedType.Interface)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x10800)] IHxTopic ItemAt([In] int index); [return: MarshalAs(UnmanagedType.Interface)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x10801)] IEnumHxTopic EnumTopics([In] int filter, [In] int options); [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="", MarshalTypeRef=typeof(EnumeratorToEnumVariantMarshaler), MarshalCookie="")] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(-4)] IEnumerator GetEnumerator(); [DispId(0x10802)] int Count { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x10802)] get; } }
Code:
auch zum Vorsortieren benutzt werden kann. :(
IHxTopicList GetTopicsFromString([In, MarshalAs(UnmanagedType.BStr)] string bszLink, [In] int options);
Notfalls müsste ich entweder wild die Werte durchprobieren ... :stupid: ... oder mal über das Problem reflektieren ... :zwinker: |
Re: Objektliste sortieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz