2012-04-12 11 views
0

Ich habe eine Liste von Strings, die den Namen der Kategorien zeigt, zu denen ein Film gehört. Ich mache eine Klasse, die Liste definieren, implementieren Liste < String> und IComparable-Schnittstelle, um in PivotViewerStringProperty zu verwenden, wie unten:Welche Sortierstrategie sollte ich für diesen Fall verwenden?

public class SLCategoryList : List<String>, IComparable 
{ 
    public int CompareTo(object obj) 
    { 
     return this[0].CompareTo((obj as SLCategoryList)[0]); 
    } 
} 

Der Punkt hier ist ein Film zu vielen Kategorien gehören soll, und ich möchte eine Sortierung Strategie, so dass es pivnviewer machen und eine Datenbank von Filmen nach jeder Kategorie sortieren kann. Daher sollte derselbe Film in zwei oder mehr Kategorien gleichzeitig angezeigt werden, wenn die Anwendung ausgeführt wird.

Welche Sortierstrategie sollte ich verwenden?

+4

Können Sie uns ein konkreteres Beispiel geben? Ich glaube nicht, dass du überhaupt * sortieren willst; Ich denke du willst * Gruppierung *. Aber es ist schwer ohne ein Beispiel zu sagen. –

+0

Das endgültige Ziel ist "Gruppierung", ja. Aber mit dem Entwicklungsaspekt erfordert der Pivotviewer, dass das für die Eigenschaft verwendete Datenfeld (StringProperty, NumericProperty, ...) eine Sort() -Methode haben muss. Das führt mich dazu, SLCategory mit IComparable-Schnittstelle zu implementieren, und dann ist CompareTo-Methode. Also mein Problem ist jetzt auf diese CompareTo-Methode verweisen. – ducnh

Antwort

1

Nehmen wir an, wir einige Film Meta-Daten haben:

class MovieMetaData 
{ 
    public string Title { get; set; } 
    public List<string> Categories { get; set; } 
} 

IEnumerable<MovieMetaData> movies = /* Some initialization. */; 

Ich würde Gruppe meine Filme in einer von zwei (sehr ähnlich) Möglichkeiten:

var categories = movies.SelectMany(m => m.Categories).Distinct(); 
var groups = categories 
    .Select(c => Tuple.Create(c, movies 
      .Where(m => m.Categories.Contains(c)) 
      .OrderBy(m => m.Title))); 


foreach (var category in groups) 
{ 
    Console.WriteLine("Category: {0}", category.Item1); 

    foreach (var movie in category.Item2) 
    { 
     Console.WriteLine(movie.Title); 
    } 
} 

Oder Gruppe die Kategorien anstatt distinct (obwohl ich in diesem Fall fühlen sich sauberer - stelle ich die Titel ohnehin zu deutlichen am Ende mit):

var categories = movies.SelectMany(m => m.Categories); 
var groups = categories 
    .Select(c => Tuple.Create(c, movies 
      .Where(m => m.Categories.Contains(c)) 
      .OrderBy(m => m.Title))) 
    .GroupBy(g => g.Item1); 


foreach (var category in groups) 
{ 
    Console.WriteLine("Category: {0}", category.Key); 

    foreach (var movie in category.SelectMany(c => c.Item2).Select(m => m.Title).Distinct()) 
    { 
     Console.WriteLine(movie); 
    } 
} 

(Hinweis: hier habe ich einen anderen Ansatz vorgeschlagen. Es funktioniert möglicherweise nicht mit dem, was Sie versuchen, aber ich denke, ich würde mehr Informationen benötigen, um eine bessere Antwort zu geben.)

Verwandte Themen