2016-09-27 4 views
0

Ich habe eine Liste von Dateinamen, die etwa wie folgt aussehen:Sortierung/Gruppierung Elemente in einer Liste

SAN003A-S6cp-201607221655.SSHOW_SYS.tgz 

SAN003A-S7cp-201607221655.SSHOW_SYS.tgz 

BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz 

BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz 

Die Gemeinsamkeiten wird die ‚SNCP‘ Muster sein, wobei N eine Zahl ist. Was davor und danach ist, kann sich unterscheiden. Es ist eine maschinengenerierte Ausgabe von einem Netzwerkschalter. Ich kann 1, 2 oder mehr in der Liste haben. Ich kann mit 1 oder 2 umgehen. Entweder bedeutet das, dass sie vom selben Switch stammen. Dateien von demselben Switch werden vor und nach dem 'SNcp' übereinstimmen. Wenn es mehr als 2 gibt, bedeutet dies, dass Protokolle von mehreren Switches im selben Ordner gemischt werden. Im obigen Beispiel gibt es 2 Schalter. Ich muss in der Lage sein, nach dem "SNcp" -Muster zu sortieren und/oder zu gruppieren. Ich denke, ich brauche eine Regex, um es zu tun, aber wenn ich nach Gruppierungslisten durch Regex suche, bekomme ich, wie man benannte Gruppen tut. Ich bin also nicht sicher, was das Prädikat für eine GroupBy sein sollte. Die Startposition des "SNcp" -Musters wird ebenfalls variieren, also bin ich mir nicht sicher, wie ich einen Substring machen würde.

+0

Wie viele Gruppen möchten Sie oben für die Einzelteile erhalten? Ich meine, "N" ist in allen vier verschieden, also suchen Sie im obigen Beispiel nach vier Gruppen? – dasblinkenlight

+0

Anstelle von regulären Ausdrücken möchten Sie vielleicht den Index des ersten Gedankenstrichs mit 'string.IndexOf' abrufen und ihn dann verwenden, um die gewünschten Teilzeichenfolgen zu erhalten, die Sie gruppieren möchten. – juharr

+1

@dasblinkenlight - Für die oben genannten möchte ich zwei Gruppen, eine mit den Dateinamen, die mit 'SAN003A' beginnen und eine mit den Dateinamen, die mit 'BrocadeRK4' beginnen –

Antwort

0

Also, um dies zuverlässig zu tun, müssen Sie die Tatsache manipulieren, dass Sie in der Tat wissen, dass es ein Muster und einen Grund für die verschiedenen Dinge gibt. Ich nehme an, die Art hier ist A-Z absteigend. Haben Sie etwas allgemeinen Algorithmus:

Create a Dictionary<String, List<File>>. 
FOREACH File 
    collect the first substring (0 to the first -) 
    try to add the file to the dictionary using the substring as a key 
     if it works, go to the next one 
    Catch if the Key doesn't exist 
     add the substring to the dictionary as a key with a new list 
     add the file to the dictionary using the new key. 
end FOREACH 
FOREACH key in the dictionary 
    sort the list alphabetically 
end FOREACH 

Also, Wörterbücher Gruppierung Dinge durch eine Gemeinsamkeit wirklich gut sind, die Sie deutlich gemacht haben, ist entweder die Switch-Taste (SNc) oder der Name links von ihm (SAN3000A und das Gleiche). Wir können dies tun, weil es auch ein gemeinsames Trennzeichen (-) für alle möglichen Dateien gibt, sodass ich zuverlässig "raten" kann, woher mein Schlüssel kommt.

+0

das ist ein interessanter Gedanke. er Wert könnte eine Liste mit den 2 Dateien von jedem Schalter in der Liste sein .... –

+0

Richtig. Ehrlich gesagt gibt es einen Grund, warum ich mit einem allgemeinen Algorithmus geantwortet habe. Sie können die Bedingung im Sammlungsschritt mit jeder Bedingung ändern, die Sie gruppieren möchten. Mit dieser Lösung können Sie auch granular werden, indem Sie Dictionary > durchlaufen und den gleichen Prozess für den ersten Teil (äußerer Schlüssel) und den zweiten Teil (innerer Schlüssel) wiederholen. Wörterbücher sind großartig dafür! Ich bin auch ein Fan von Dictionary , um aus Polymorphismus einen wirklichen Nutzen zu ziehen. –

0

Also, wenn ich das richtig verstehe, was Sie tun wollen, kann es für Sie nützlich sein:

var files = new[] 
{ 
    "SAN003A-S6cp-201607221655.SSHOW_SYS.tgz", 
    "SAN003A-S7cp-201607221655.SSHOW_SYS.tgz", 
    "BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz", 
    "BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz" 
}; 

var regex = new Regex("-(S[0-9]+cp)-", RegexOptions.Compiled); 
var grouped = files.GroupBy(x => regex.Match(x).Groups[1].Value); 
if (grouped.Any(x => x.Count() > 2)) 
{ 
    // logs from multiple switches are mixed in the same folder 
} 
Verwandte Themen