Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[erledigt] Menge von Ersetzungsregeln so sortieren, dass schon Ersetztes nicht nochmal ersetzt wird

Moderationshinweis von herbivore (24.11.2011 - 09:51:13):

Der Thread ist leider etwas unübersichtlich und länglich. Wichtige Informationen zu Zyklen bzw. zur Unmöglichkeit, das Problem überhaupt durch Sortieren zu erschlagen, wenn die Regeln am Ende global angewendet werden, kommen erst ziemlich spät. Wenn man vor einem vergleichbaren Problem steht, sollte man den Thread also gründlich und komplett lesen, um nichts wichtiges zu übersehen.

ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

[erledigt] Menge von Ersetzungsregeln so sortieren, dass schon Ersetztes nicht nochmal ersetzt wird

beantworten | zitieren | melden

Hi,

ich stehe gerade vor einem kleinen Problem.
Folgender Ausgangspunkt:

Ich habe ein csv-Datei mit "Alt-Neu" Werten.
Darin könnte z. B. folgendes stehen:

1;11
2;22
3;33
22;5
5;55

Würde ich die Daten in der gegebenen Reihenfolge übersetzen hätte ich folgendes Problem:

Kein neuer Wert hätte den Wert 22 da diese in 5 übersetzt würde.
Kein neuer Wert hätte den Wert 5 da diese in 55 übersetzt würde.

Zur Info: Die Daten könnten auch Strings sein - Also bitte nicht auf die Zahlen einschießen.

Also muss ich die Daten so sortieren das folgendes herauskommt:

5;55
22;5
1;11
2;22
3;33

Ich habe schon eine Klasse "Replacement" mit den Properties "OldValue" und "NewValue" und eine Liste dazu:

var a = new List<Replacement>();

Jetzt suche ich nach einer schlauen Art die Daten korrekt zu sortieren.

Hat hier jemand eine Idee?

Danke voran,

Chris
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Du musst eine Topologie (für eine topologische Sortierung) aufbauen.
Im Endeffekt musst du also die Übersetzungen als Pfade und die Werte als Knoten in einem Graph verstehen. Da dein Pfad (bzw. Graph) gerichtet ist, kannst du ein Ende und einen Anfang ausmachen.
Wenn du nun von Ende bis Anfang sortierst, dann hast du dein Ergebnis.

Dazu auch in der Wikipedia: Tolopogische Sortierung (EN)
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Grumbler85 am .
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo ian_mcdeath,

ich bin jetzt nicht sicher ob ich die Aufgabe richtig verstanden haben, aber warum packst du die beiden Spalten nicht ein Dictionary<Alt, Neu> und führst mit diesem die Übersteztung durch?


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

@Grumbler85
Ich habe leider (noch) nicht die leiseste Ahnung wie ich mein Problem mit einer solchen Sortierung lösen könnte - Kling aber nach einem Ansatz.

Hast du noch weiter Infos wie ich diese Sortierung auf mein Problem anwenden kann bzw. Links - Hinweise oder sonstiges?

Merci.

@gfoidl

Wenn du dir die Liste anschaust erkennst du das mit einem unsortierten Dic folgende Probleme auftreten würden:

Kein neuer Wert hätte den Wert 22 da diese in 5 übersetzt würde.
Kein neuer Wert hätte den Wert 5 da diese in 55 übersetzt würde.

Außerdem verwende ich eine eigene Klasse um Doppelnennungen zu erkennen und dem Benutzer vorab darüber zu informieren.

Ob Dic. oder liste oder sonstwas - meine Frage dreht sich allgemein um die Sortierung der Daten anhand der gegebenen Felder/Spalten/Properties.

Chris
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ian_mcdeath am .
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo ian_mcdeath,

wie wird denn übersetzt?
Zitat
Kein neuer Wert hätte den Wert 22 da diese in 5 übersetzt würde.
Kein neuer Wert hätte den Wert 5 da diese in 55 übersetzt würde.
Wenn 22 kommt und nach 5 übersezt wird, so muss halt darauf geachtet werden dass diese (übersetzte) 5 nicht nochmal übersetzt wird. Aber dazu fehlt - mir - die Info über die Übersetzung.


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Wenn ich das richtig verstehe willst du keine Doppelübersetzung.

5 -> 55: Okay
22 -> 5: Okay

22 -> 5 -> 55: BadCase

Abgessehen von der Topologischen Sortierung kannst du auch einfach zwei Listen machen:

Liste1: Nicht übersetzte Objekte (Queue erscheint geeignet, weil es Pop() gibt)
Liste2: Übersetze Objekte

Damit vermeidest du die doppelte Übersetzung.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

Moderationshinweis von gfoidl (23.11.2011 - 16:13:20):

Die Queue<T> hat Dequeue, der Stack<T> wäre das mit dem Pop.

private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hi,

wenn ich das richtig verstehe ist dein letzter Ansatz, dass ich einige Übersetzungen nicht mache?!?

Das klappt leider nicht - gemacht werden müssen alle...
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Ähm - doch doch machen sollst du sie schon, aber du nimmst sie aus einer Liste heraus, übersetzt sie und legst sie danach in der "schon abgearbeitet" Liste ab, etwa:


public List<WhateverObject> TranslateAll() {
  Queue<WhateverObject> originals;
  List<WhateverObject> results;

  //Originials füllen

  while(originals.Size > 0)
  {
    var current = originals.Pop();
    TranslateObject(current);
    results.Add(current);
  }

  return results;
}
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

@gfoidl

Darauf zu achten das es nicht übersetzt wird geht nicht da alle Werte übersetzt werden müssen.

Um das beschriebene Problem zu vermeiden braucht es eben diese Sortierung, sodass alle Werte übersetzt werden können.

Hier geht es um 1.000.000 Übersetzungen +
Da kann ich keinen Azubi zum manuellen Testen der Daten dransetzen. ;o)

Chris
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo ian_mcdeath,

es soll ja keiner händisch prüfen ;-)
Der letzte Vorschlag von Grumbler85 geht ja genau in die Richtung. TranslateObject ist dann das Nachschlagen im Dictionary. Wo ist hier das Problem?


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hi,

kein Problem denke ich.
Ich teste das mal mit einem STACK - Nicht Queue. Laut MSDN bietet der Stack den Pop - nicht der Queue. Oder habe ich da was übersehen?

Wenn's funktioniert kommt gleich der Code.

Chris
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

der Stack hat Push(...) und Pop(), die Queue analog dazu Enqueue(...) und Dequeue().
Für Diene Zwecke eignet sich die Queue wahrscheinlich besser, ausser es ist Dir egal in welcher Reihenfolge die Elemente abgearbeit werden (Stack ist ein LIFO, Queue ein FIFO)

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Überraschung...

Hier der Code:


while (queue.Count > 0)
{
   var item = queue.Dequeue();

   // Check if we can use this right now
   var ok = queue
      .Where(pair => string.Compare(item.NewValue.Trim(), pair.OldValue.Trim(), StringComparison.InvariantCultureIgnoreCase) == 0)
      .Count() == 0;

   // No usable right now
   if (!ok)
   {
      queue.Enqueue(item);
      continue;
   }

   // Do the job
   Console.WriteLine(item);
}

Und hier das Ergebnis:

1 | 11
3 | 33
5 | 55
22 | 5
2 | 22

Sieht zwar anders aus als das von mir anvisierte Ergebnis - Hat aber den gleichen Effekt wenn ich mich nicht irre.
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Durch die Queue wird aber deine Überprüfungslogik, ob du es machen darfst überflüssig ...
Solange es drin ist, darfst du es einfach übersetzen.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hi Grumbler85,

das sehe ich nicht so.

Die Überprüfung schaut nach ob ein weiteres element im queue ist, dessen alter Wert mit dem zu verarbeitenden alten Wert kollidiert.

Wenn dem so ist packe ich es wieder (hinten) an und versuche es später noch einmal.

Zum späteren Zeitpunkt kann das Element mit dem es kollidiert ist aus der Liste raus sein und dann kann ich weiterarbeiten.

Mit diesem Code benötige ich nur einen Queue und nicht einen Queue und eine Liste.
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Es kann nicht "kollidieren", da du es nach der Verarbeitung nicht mehr in die Queue steckst ...

Im übrigen hast du eine Endlosschleife, wenn 22 -> 5 und 5 -> 22 in der Übersetzungsliste stehen und sowohl 22 als auch 5 in deiner Queue sind.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hi Grumbler85,

sorry aber ich steige nicht dahinter wie dein Vorschlag funktioniert bzw. was ich besser machen könnte.

Löst deine Variante denn auch das Problem der Zirkelbezüge?

Hier mal ein komplettes Stück Code zum testen.


using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
   class Program
   {
      static void Main(string[] args)
      {
         var queue = new Queue<MyItem>();

         queue.Enqueue(new MyItem() { NewValue = "11", OldValue = "1" });
         queue.Enqueue(new MyItem() { NewValue = "22", OldValue = "2" });
         queue.Enqueue(new MyItem() { NewValue = "33", OldValue = "3" });
         queue.Enqueue(new MyItem() { NewValue = "5", OldValue = "22" });
         queue.Enqueue(new MyItem() { NewValue = "55", OldValue = "5" });

         while (queue.Count > 0)
         {
            var item = queue.Dequeue();

            // Check if we can use this right now
            var ok = queue
               .Where(pair => string.Compare(item.NewValue.Trim(), pair.OldValue.Trim(), StringComparison.InvariantCultureIgnoreCase) == 0)
               .Count() == 0;

            // No usable right now
            if (!ok)
            {
               queue.Enqueue(item);
               continue;
            }

            // Do the job
            Console.WriteLine(item);
         }

         Console.ReadLine();
      }

      private class MyItem
      {
         public override string ToString()
         {
            return string.Format(@"{0};{1}", OldValue, NewValue);
         }

         public string NewValue { get; set; }
         public string OldValue { get; set; }
      }
   }
}
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Ich dachte du willst so etwas hier machen:

Liste1 (Quelle): 1, 3, 4, 5, 22, 12
Liste2 (Übersetzungen): 1 -> 11, 3 -> 13, 4 ->14, 5 -> 22, 22->12, 12 -> 13

Liste3 (Übersetzungen auf Quelle angewendet):
11, 13, 14, 22, 12, 13

Wenn das der Fall ist, kannst du die Queue benutzen, aber nicht für die Übersetzungen, sondern für die Quelle - die Reihenfolge der Übersetzung ist in dem Fall dann unerheblich.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,

noch eine ganz andere Idee: benutze einen Regex: (22)|(1)|(2)|(3)|(5) (nach Länge sortiert). Dann kannst Du beim Durchgehen der Treffer anhand der Gruppennummer die Ersetzung vornehmen.

Und eine weitere: Du ersetzt in einem ersten Durchgang alle betroffenen Teile durch {0}, {1}, usw und benutzt dann String.Format mit einem Array Deiner Ersetzungen.

Der beste Weg hängt sicher von den tatsächlichen Daten ab.
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

der Codeschnippsel den ich gepostet habe zeigt exakt die Ausgangslage und die Lösung die ich mit euch zusammen dafür gebastelt habe.

Mit einer kleinen Erweiterung der Lösung (eine Prüfung vorab) fange ich auch Zirkelbezüge ein.

Sobald ich den Teil fertig habe stelle ich ihn hier rein.

Danke soweit für die Ideen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ian_mcdeath am .
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Ok,

hier der Code für die Zirkulären Verweise.
Anders als in meiner Signatur dargelegt bin ich offen für Fehlerkorrekturen wenn ihr welche findet.


private IEnumerable<ReplacementPair> GetCircularItems(IEnumerable<ReplacementPair> pairs)
{
   var retItem = new List<ReplacementPair>();

   // Get a new queue
   var queue = new Queue<ReplacementPair>();

   foreach (var pair in pairs)
   { queue.Enqueue(pair); }

   // Check the queue
   var maxRounds = queue.Count;
   var rows = 0;

   while (queue.Count > 0 &&
      rows < maxRounds)
   {
      // Get the item out of the queue
      var item = queue.Dequeue();

      /* Check if we can use this right now
         * 
         * We can't use it if the new value will be later
         * translated in another value.
         * 
         * If that is the case put it back in the queue and
         * try it later again.
         */
      var canUse = queue
         .Where(pair => string.Compare(item.NewValue.Trim(), pair.OldValue.Trim(), StringComparison.InvariantCultureIgnoreCase) == 0)
         .Count() == 0;

      // Not usable right now
      if (!canUse)
      {
         queue.Enqueue(item);

         if (!retItem.Contains(item))
         { retItem.Add(item); }

         rows++;

         continue;
      }

      // Reset the counter of the circulars
      if (retItem.Contains(item))
      { retItem.Remove(item); }

      maxRounds = queue.Count;
      rows = 0;
   }

   // Return
   return retItem;
}
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ian_mcdeath,

die Lösung gefällt mir nicht. Ist zu sehr Trial and Error. [EDIT]Und stellt nicht sicher, dass schon ersetztes nicht weiter ersetzt wird.[/EDIT] Entweder du sortierst die Einträge topologisch (siehe auch Digraphen topologisch sortieren) oder du nimmst die Regex-Variante (MatchEvaluator ist cool), was beides schon oben vorgeschlagen wurde. [EDIT]Vorausgesetzt es geht am Ende darum, die Regeln in er ermittelten Reihenfolge global auf den gesamten String, in dem alle Ersetzungen ausgeführt werden sollen, anzuwenden.[/EDIT]

herbivore
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,

interessante Antwort nachdem ich nach Tips oder Code gefragt hatte die zum Teil mit einem oder zwei Sätzen oder ohne nennenswerte hilfreichen Informationen beantwortet wurden. Andere Antworten (wie der Tip mit dem Queue) haben mich auf eine Spur gebracht die zu dem funktionierenden Ergebnis führten.

Tatsächlich bis du der erste der hier zu dem Thema anscheinden schon einn Thread kannte und ihn auch zeigt.

Zum Thema selbts:
Dieser Trial and Error funktioniert. Und er funktioniert mit der gestellten Aufgabe.

Um ehrlich zu sein fehtl mir derzeit noch der Ansatz wie das mit RegEx gehen könnte.

Das Thema Digraphen topologisch sortieren wurde angesprochen - im Internet habe ich dazu auch Code gefunden jedoch (noch) nicht auf meine Ausgangslage anwenden können.
Vielleicht schaffe ich das ja mit deinem Link - ich werde es auf jeden fall versuchen (und hier darüber berichten).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ian_mcdeath am .
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ian_mcdeath,
Zitat
Um ehrlich zu sein fehtl mir derzeit noch der Ansatz wie das mit RegEx gehen könnte.
das ist wirklich einfach. Du sortierst die Strings nach Länge absteigend (Zahlen vorher nötigenfalls in Strings umwandeln). Dann wird jeder String mit Regex.Escape behandelt. Dann werden alle Strings durch Pipe ("|") getrennt zusammengefügt (aber ohne zusätzliche Leerzeichen). Dann kommt das Regex.Replace mit MatchEvaluator. Im MatchEvaluator schaust du, was gerade gefunden wurde (Match) und lieferst aus dem Dictionary die dazu passende Ersetzung zurück. Insgesamt sind das nicht mehr als 10 Zeilen.

Das Sortieren nach String-Länge absteigend hat gegenüber der bisherigen Vorgehensweise den Vorteil, dass bei den Regeln 2 -> 5 und 22 -> 66, das Ergebnis er Ersetzung von 22 66 und nicht 55 ist.

herbivore
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ian_mcdeath,

wenn ich es mir recht überlege, ist der Ansatz mit Regex der einzige von den vorgeschlagenen (inkl. der topologischen Sortierung), der korrekt funktionieren wird.

Es gibt mehrere Probleme, die durch Sortieren nicht gelöst werden können, hier nur eins

1 -> 121
2 -> 232
3 -> 313

Egal welche Regel du zuerst anwendest, eine spätere Regel ersetzt etwas, das schon durch die erste Regel ersetzt wurde, nochmal.

herbivore
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Hi herbivore,

ich muss das Frage aber warum sollte

1 -> 121
2 -> 232
3 -> 313

zu einem Problem führen?
Weder 121, noch 232, noch 313 werden später durch einen neuen Wert ersetzt.

Ein Problem wäre folgendes:

1 -> 3
2 -> 232
3 -> 313

Am Ende würde kein Datensatz den Wert 3 haben.
Um das auszuschließen müsste die Sortierung zu einem der folgenden Ergebnisse führen:

3 -> 313
1 -> 3
2 -> 232

oder

2 -> 232
3 -> 313
1 -> 3

Es geht hier nicht um Teilstring sondern nur um Links-Rechts / Alt-Neu.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ian_mcdeath am .
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ian_mcdeath,
Zitat
aber warum sollte ... zu einem Problem führen?
du wendest die Regeln ja am Ende der Reihe nach an, aber jede für sich global auf den ganzen String, z.B. per String.Replace. Dann werden aber Teile des schon Ersetzen nochmals ersetzt.

herbivore
private Nachricht | Beiträge des Benutzers
ian_mcdeath
myCSharp.de - Member



Dabei seit:
Beiträge: 87
Herkunft: Korb

Themenstarter:

beantworten | zitieren | melden

Ok, hier zur Auflöärung was damit passiert.
Das fehlte anscheinend für einen klaren Lösungsansatz.

2 -> 232
oder auch
'abc' -> 'def' würde wie folgt angewendet;

update table [MyTable] set [MyColumn] = 'def' where [MyColumn] = 'abc'

Also kein string.replace oder ähnliches.

EDIT: Bevor es zu weiteren verwirrungen kommt:

Natürlich verwende ich SQL-Parameter statt den Wert fest zu setzen. ;)
Wer Fehler pfindet darf sie behalden.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von ian_mcdeath
nachdem ich nach Tips oder Code gefragt hatte die zum Teil mit einem oder zwei Sätzen oder ohne nennenswerte hilfreichen Informationen beantwortet wurden

Hast Du eine komplette Lösung erwartet? Du fragtest nach Ideen.

Letztlich wird nur ein Ansatz wirklich funktionieren, der den Ausgangstext als Gesamtheit betrachtet, ohne ihn zu verändern. Das ist bei den Regex der Fall (welche ich bevorzugen würde und einen Weg oben angerissen habe, wobei herbivore's Tipp mit MatchEvaluator das sogar noch wesentlich vereinfacht) oder auch bei einer Ersetzung durch etwas, was nie im Text vorkommen kann (wie eben möglicherweise die String.Format-Platzhalter).

Moderationshinweis von herbivore (24.11.2011 - 09:29:59):

Vorausgesetzt es geht am Ende darum, die Regeln in er ermittelten Reihenfolge global auf den gesamten String, in dem alle Ersetzungen ausgeführt werden sollen, anzuwenden - was ja nach Aussage aus dem Beitrag über diesem wohl nicht der Fall ist.

private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 637

beantworten | zitieren | melden

Ok, das bringt endlich mal Klarheit in die Sache. Bisher war mir nämlich nicht klar, wo dein Problem liegt.

Laut topologie Sortier-blabla musst du dir merken, ob welche Datensätze du schon übersetzt hast und diese von der Übersetzung ausschliessen.
Hier könntest du dir eine Hashtable mit den UIDs der jeweiligen DS machen.
private Nachricht | Beiträge des Benutzers