AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objektliste sortieren

Ein Thema von MathiasSimmack · begonnen am 11. Sep 2005 · letzter Beitrag vom 11. Sep 2005
Antwort Antwort
MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Objektliste sortieren

  Alt 11. Sep 2005, 14:28
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:
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;
  }
}
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
Code:
public interface IHxTopicList : IEnumerable
@Robert:

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.
btw: Welche Bedeutung hat eigentlich yield? Ich werde aus der Erklärung im Framework nicht so recht schlau.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Herkunft von Methoden/Properties ermitteln

  Alt 11. Sep 2005, 16:40
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:
Code:
  catch {}
Sowas war/ist auch ein paar mal in deinem MsHelp2 Code drin und ich wette, es hatte die damaligen ThreadExceptions genauso geschluckt wie ein paar andere Glitches...
(Manchmal will dein AddIn die hXs aktualisieren, wenn ich #d schließe. )

Mit der Sortierung machst du mal lieber einen neuen thread auf und postest das Interface von dem HxiDings...
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Herkunft von Methoden/Properties ermitteln

  Alt 11. Sep 2005, 17:13
Zitat von Robert_G:
Btw: Davon hier wird mir ganz schlecht!
Zitat:
Code:
  catch {}
Sowas war/ist auch ein paar mal in deinem MsHelp2 Code drin und ich wette, es hatte die damaligen ThreadExceptions genauso geschluckt wie ein paar andere Glitches...
Was soll ich sonst machen?

Zitat:
(Manchmal will dein AddIn die hXs aktualisieren, wenn ich #d schließe. )
Ich habe auch im #d-Forum gelesen, dass nach Installation von Microsofts VSIP-Dokumenten das Updatefensterchen des Addins erscheint und nicht mehr verschwindet. Aber da konnte ich bislang jegliche Verantwortung auf Microsoft schieben, denn ein User schrieb, nach Entfernen der VSIP und Reparieren seiner Help 2.0-Umgebung lief alles wieder.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: Herkunft von Methoden/Properties ermitteln

  Alt 11. Sep 2005, 17:20
Zitat von MathiasSimmack:
Was soll ich sonst machen?
Darauf reagieren!
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.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Objektliste sortieren

  Alt 11. Sep 2005, 18:06
Okay, okay, ... ich habe ein paar MessageBoxen eingebaut. Ich sehe die nur nie, , ganz so übel scheint mein Code also gar nicht zu sein.

Könnten wir uns nun wieder der Sortierung widmen? Äh, was wolltest du? Was soll ich posten?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Objektliste sortieren

  Alt 11. Sep 2005, 20:44
Okay, hier ist die Deklaration von IHxTopicList. Kann man so was auch direkt sortieren?
Code:
[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; }
}
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
Code:
IHxTopicList GetTopicsFromString([In, MarshalAs(UnmanagedType.BStr)] string bszLink, [In] int options);
auch zum Vorsortieren benutzt werden kann.
Notfalls müsste ich entweder wild die Werte durchprobieren ... ... oder mal über das Problem reflektieren ...
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Objektliste sortieren

  Alt 11. Sep 2005, 20:48
Zitat von MathiasSimmack:
Okay, okay, ... ich habe ein paar MessageBoxen eingebaut. Ich sehe die nur nie, , ganz so übel scheint mein Code also gar nicht zu sein.
Auf deiner Maschine hatte es, bis auf die Threadstreuner keine Probleme gegeben. MessageBoxes landen nicht im Logfile von #develop und nerven die User, bei dene es vllt raucht, wie Hölle.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz