2016-08-26 1 views
1

so iam versuchen, ein "Programm" zu machen, die mir eine Ausgabe von Passwörtern gibt, die bald in meinen Firmen AD ablaufen wird. aber ich stoße auf ein kleines Problem. Wenn ich "array.sort (array)" anrufe, dann ist es ein String, der eine Zeitspanne und Namen von wer es ist, es scheint, dass es Menschen gruppiert, wie lange es noch übrig ist, aber nicht die kleinste Nummer zuerst. hat jemand eine Idee, wie man das beheben kann, da es eine Schnur ist? * Ich kenne iam einen Amateur-Programmierer mit lausigen Code, der schwer zu lesen ist!mit Array.sort auch eine Zeichenfolge

foreach (Principal p in grp.GetMembers(false)) 
{ 
    TimeSpan tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration(DOMAIN, p.SamAccountName); 
    TimeSpan under14 = new TimeSpan(14, 00, 00, 00); 
    TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00); 
    if (tidtilbage < under14 && tidtilbage > ikkeMinus10) 
    { 
     string lines = tidtilbage.ToString("%d") + " dag(e)" + " " + tidtilbage.ToString("%h") + " time(r)" + " - " + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n"; 
     sorted[i] = lines; 
     Array.Sort(sorted); 
     i++; 
    } 
    else 
     continue; 
} 

foreach (var item in sorted) 
{ 
    if (item == null || item == "") 
     continue; 
    else 
    { 
     Console.WriteLine("{0}", item); 
     myWriter.WriteLine("{0}", item); 
    } 
} 
myWriter.Close(); 

dies ist der Ausgang i erhalten:

enter image description here

+0

Also was ist das Problem?! – Vikrant

+0

Ich denke sein Problem ist, dass er nach Tagen sortiert anstatt nach Zeitspannen sortieren möchte. "11" als String kommt vor "4" als String. –

+0

in der Tat Sebastian :) –

Antwort

2

So können Sie die Saiten durch den numerischen Wert sortiert werden soll, die zuerst kommt? Dann müssen Sie diese Teilzeichenfolge in int mit int.Parse konvertieren. Sie können mit LINQ bestellen OrderBy:

sorted = sorted 
    .OrderBy(s => int.Parse(new String(s.TakeWhile(Char.IsDigit).ToArray()))) 
    .ToArray(); 

Beachten Sie, dass dies eine Ausnahme verursachen wird, wenn die Zeichenfolge nicht mit einer ganzen Zahl beginnt.

Aber in diesem Fall könnte es besser sein, das Original TimeSpan auch zu speichern, dann ist es einfacher zu sortieren.

TimeSpan under14 = new TimeSpan(14, 00, 00, 00); 
TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00); 

sorted = grp.GetMembers(false) 
    .Select(account => new 
    { 
     tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration(DOMAIN, account.SamAccountName), 
     account 
    }) 
    .Select(x => new 
    { 
     x.tidtilbage, 
     lines = x.tidtilbage.ToString("%d") + " dag(e)" + " " + x.tidtilbage.ToString("%h") + " time(r)" + " - " + x.account.SamAccountName.ToUpper() + " - " + x.account.DisplayName + "\n\n" 
    }) 
    .Where(x => x.tidtilbage < under14 && x.tidtilbage > ikkeMinus10) 
    .OrderBy(x => x.tidtilbage) 
    .Select(x => x.lines) 
    .ToArray() 
+0

Muss auch den nächsten Int (Stunden) analysieren und dann Tage und Stunden zu einem Int kombinieren. Wenn es viele Strings gibt, die sie wahrscheinlich nur einmal parsen sollten, erstellen Sie eine temporäre Struktur, die sowohl den String als auch int enthält und nach int sortiert, aber am Ende die Strings übernimmt. – Dialecticus

+0

Danke für die Antwort Tim, ich werde das sofort ausprobieren! :-) –

+0

@ MathiasRønnowNørtoft: beachte, dass ich meine Antwort bearbeitet habe –

0

Ein wenig aus der OP aber als tidtilbage ist bereits TimeSpan Typ. Sie könnten auch eine List anstatt einer Array verwenden und klarere Operationen durchführen.

Eine Probe Beispiel:

List<TimeSpan> tsList = new List<TimeSpan>(); 
for (int i = 1; i <= 10; i++) 
{ 
    Random rnd = new Random(i); 
    TimeSpan ts = new TimeSpan(0,0,rnd.Next(10000)); 
    tsList.Add(ts); 
} 

//This is the line you will need 
tsList = tsList.OrderBy(x => x.TotalSeconds).ToList(); 

Alle Ihre tidtilbage s haben eine TotalSeconds Eigenschaft, dass man leicht OrderBy().

Nur um Ihnen eine Vorstellung zu geben ..

0

@TimSchmelter

foreach (Principal p in grp.GetMembers(false)) 
      { 
       TimeSpan tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration("cv.local", p.SamAccountName); 
       TimeSpan under14 = new TimeSpan(14, 00, 00, 00); 
       TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00); 
       sorted = grp.GetMembers(false) 
       .Select(x => new 
        { 
          tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration("cv.local", p.SamAccountName), 
          lines = tidtilbage.ToString("%d") + " dag(e)" + " " + tidtilbage.ToString("%h") + " time(r)" + " - " + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n" 
        }) 
         .Where(x => x.tidtilbage < under14 && x.tidtilbage > ikkeMinus10) 
         .OrderBy(x => x.tidtilbage) 
         .Select(x => x.lines) 
         .ToArray(); 

         i++; 



      } 
Verwandte Themen