2012-05-28 12 views
6

Scheint wie dies eine einfache Aufgabe sein sollte, aber ich kann nicht herausfinden, wie dies mit LINQ zu tun. Die einzige Information, die ich bisher finden konnte, betrifft das Round-Robin-Turnier-Format, was ich nicht möchte. Ich suche vielleicht falsch. Angesichts der folgenden Liste:LINQ Auftrag von "Round Robin"

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" }; 

Wie kann ich diese (vorzugsweise unter Verwendung von Linq) sortieren, so dass es in „Round-Robin“, um herauskommt, das heißt, wählen Sie jedes Einzelstück schon einmal wiederholt. So dass die obige Liste würde so kommen (es ist nicht wichtig, wenn es aus in alphabetischer Reihenfolge kommt, obwohl diese Liste der Fall ist):

var sorted [] { "apple", "banana", "candy", "fruit", "apple", "banana", "banana" }; 

Ich weiß, ich kann dies tun, indem über sie iterieren auf die harte Tour, ich Ich habe nur auf etwas einfacheres gehofft. Hat jemand einen Einblick, wie man das macht? Danke im Voraus!

+0

Können Sie genau erklären, was Sie mit "Round-Robin" -Sortieren meinen? – mattytommo

+0

Er meine "Round-Robin" -Sortieren http://en.wikipedia.org/wiki/Round-robin – Likurg

Antwort

8
var sorted = items.GroupBy(s => s) 
    .SelectMany(grp => grp.Select((str, idx) => new { Index = idx, Value = str })) 
    .OrderBy(v => v.Index).ThenBy(v => v.Value) 
    .Select(v => v.Value) 
    .ToArray(); 
+0

sollte lernen, Copypaste richtig zu lernen. akzeptiere das, das funktioniert. – Alex

+1

netter Ansatz, ich mag es! – HugoRune

+0

Sie Herr sind großartig. Es funktioniert perfekt. Vielen Dank! Alles, was ich ändern musste, war die GroupBy für mein Projekt, um nach dem eigentlichen einzigartigen Element zu gruppieren, das mir wichtig war, der Rest war buchstäblich kopierfähig. Danke noch einmal! – Eric

0

Ich habe dieses eine Mal, grub den Code oben:

//Originially written for lists, all you need is prepend a .ToList() where needed to apply this to an array 
List<string> src = new List<string> { "string1", "string2" }; //source 
List<string> dst = new List<string>(); 

dst.AddRange(src.Distinct()); 
dst.ForEach(d => src.RemoveAt(src.FindIndex(i => i.Equals(d)))); //remove the first occurrence of each distinct element 
dst.AddRange(src); 
0

Gerade gesehen, dass zwei Antworten tauchte, während ich dies schreibe; oh, hier ist ein anderer Weg:

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" }; 

var uniqueItems = items.Distinct().OrderBy(item => item); // alphabetical orderBy is optional 

var duplicateItems = items 
        .GroupBy(item => item) 
        .SelectMany(group => group.Skip(1)) 
        .OrderBy(item => item); // alphabetical orderBy is optional; 

var sorted = uniqueItems.Append(duplicateItems).ToArray(); 
Verwandte Themen