2016-07-04 7 views
0

Ich muss den Wert eines Wörterbuchs bei einem bestimmten Schlüssel zählen. Mein Code ist:Zählwert bei einem bestimmten Wörterbuchschlüssel C#

foreach (CurrentCluster curCluster in curClusters){ 
    twObjClus.WriteLine("Cluster_ID: {0} - Cluster_Size: {1} \n", 
    curCluster.GetClusterID(), curCluster.GetClusterSize()); 
    twObjClus.WriteLine("------------------------------------------------------------"); 
    foreach (EvoObject eEvoObject in curCluster.GetClusterObjects()){ 
     Author eAuthor = (Author)eEvoObject.GetOriginalObject(); 

     twObjClus.WriteLine("\n"); 
     twObjClus.WriteLine(@"Author_ID: {0}, Author_Name: {1} ", 
     eAuthor.AuthorID, eAuthor.AuthorName); 
     twObjClus.WriteLine("----------------------------------------------------------"); 

     Dictionary<int, Tuple<int, int>> tPapers = 
     eAuthor.GetPapersBetweenYears(year, year + 1); 
     List<int> tCoAuthors = 
     eAuthor.GetCoAuthorsBetweenYears(year, year + 1); 
     List<int> tVenues = eAuthor.GetVenuesBetweenYears(year, year + 1); 
     foreach (var kvpaper in tPapers){ 
      // Key is Paper_ID, Item1 is Paper_Category, Item2 is Year 
      twObjClus.WriteLine("PaperID: {0}, PaperCategory: {1}, Year: {2}", 
      kvpaper.Key, kvpaper.Value.Item1, kvpaper.Value.Item2); 
     } 
     foreach (var kvCoAuthor in tCoAuthors){ 
      twObjClus.WriteLine("CoAuthorID: {0}", kvCoAuthor); 
     } 
     foreach (var kvVenue in tVenues){ 
      twObjClus.WriteLine("VenueID: {0}", kvVenue); 
     } 
    } 
    twObjClus.WriteLine("\n\n"); 
} 
twObjClus.Flush(); twObjClus.Close(); 

Jetzt möchte ich jeden anderen Wert zählen, bei Paper_Category heißt Item1 des Tuple in Dictionary.

Minor Details
Das ist eigentlich das Clustering, die ich tue Ergebnisse meiner Daten zu erhalten. Da jeder Cluster eine Anzahl von Paper_Category ies mit einigen Objekten verbunden hat. Was ich möchte, ist, jede Kategorie zu zählen und diesen Cluster als mit einer einzelnen Kategorie zu speichern, d. H. Der Kategorie mit der höchsten Anzahl.

Wenn die eAuthor eine Liste ist, und ich habe höchsten Paper_Category Zahl unter allen eAuthor s zu überprüfen, und jedes eAuthor können auch mehrere Paper_Category ies umfassen, dann wie zählen? Wie kann ich die Existenz jedes Wertes von Paper_Category zählen und es als Text schreiben?

+0

Benötigen Sie weitere Informationen, möchten Sie nach Paper_Category gruppieren, geben Sie bitte ein Beispiel an –

+0

Einige kleine Details sind jetzt da! – maliks

Antwort

5
var categoryGroups = tPapers.Values.GroupBy(t => t.Item1); 

foreach(var g in categoryGroups) 
    Console.WriteLine("Category:{0} Count:{1}", g.Key, g.Count()); 

Wie kann ich auswählen oder irgendwo speichern (das heißt in einer Variablen) die Kategorie mit der höchsten Zählung?

var highestCount = categoryGroups.OrderByDescending(g => g.Count()) 
    .Select(g => new { Category = g.Key, Count = g.Count() }) 
    .First(); 
Console.WriteLine("Category:{0} Count:{1}", highestCount.Category, highestCount.Count); 

Da Sie die Papier-Kategorie Zählung über alle Autoren in eAuthor und this scheinen Ihre Klassen erhalten möchten, verwenden SelectMany:

var categoryGroups = eAuthor 
    .SelectMany(a => a._Papers.Select(p => p._PaperCategory)) 
    .GroupBy(pc => pc); 
// rest is same 
+0

Wie kann ich die Kategorie mit der höchsten Anzahl auswählen oder speichern (d. H. In einer Variablen)? – maliks

+0

@taufel: Ich habe einen Ansatz zur Verfügung gestellt. Wenn Sie es außerhalb des Methodenbereichs speichern oder auf eine andere Methode übertragen müssen, würde ich entweder eine Klasse oder ein Tuple verwenden (wenn es nicht außerhalb der Klasse verwendet wird). –

+0

Ich werde etwas mehr Code zum besseren Verständnis liefern, dann kann man den Punkt lösen – maliks

1

Linq verwenden zu bekommen der höchste wie du in deinen Kommentaren erwähnt hast:

int? highestCat = tPapers.Values.GroupBy(p => p.Item1) 
       .OrderByDescending(x => x.Count()) 
       .FirstOrDefault()?.Key; 

Console.WriteLine($"Highest Paper_Category is: { highestCat }"); 
+0

Bekomme ich den Schlüssel oder 'Paper_Category' in' highestCat'? – maliks

+0

@Taufel Ja, es ist 'Item1' in den Werten des Wörterbuchs. – user3185569

+0

Wenn der 'eAuthor' eine Liste ist und ich die höchste 'Paper_Category' Zählung unter allen' eAuthor's überprüfen muss, dann? – maliks

Verwandte Themen