2016-07-04 2 views
0

특정 키에서 사전 값을 계산해야합니다. 내 코드는 다음과 같습니다 특정 사전 키 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(); 

가 지금은 DictionaryTuplePaper_CategoryItem1에 각각 다른 값을 계산합니다.

사소한
이 실제로 내 데이터에서 결과를 얻을 수 있도록하고있어 클러스터링이다. 각 클러스터에는 일부 개체와 연결된 Paper_Category 수가 있습니다. 내가 원하는 것은 각 카테고리를 세어 단일 카테고리, 즉 가장 많은 수의 카테고리로 클러스터를 저장하는 것입니다. eAuthor가리스트와 나는 모든 eAuthor들 중 가장 높은 Paper_Category 수를 확인해야하고, 각 eAuthor는 또한 여러 Paper_Category 이거를 포함 할 수있는 경우

, 그럼 어떻게 계산합니까?

어떻게 Paper_Category의 각 값의 존재를 계산하고 텍스트로 쓸 수 있습니까?

+0

더 자세한 정보가 필요하면 Paper_Category별로 그룹으로 묶으시겠습니까? 예를 들어주십시오 –

+0

몇 가지 세부 사항이 있습니다! – maliks

답변

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

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

어떻게 선택하거나 어딘가에 가장 높은 카운트 (즉, 변수) 범주를 저장?


당신이 eAuthorthis의 모든 저자에 걸쳐 종이 카테고리 카운트를 얻기 위해 원하기 때문에

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); 
이 수업 것 같다, SelectMany 사용

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

가장 높은 수의 카테고리를 선택하거나 저장할 수 있습니까? – maliks

+0

@taufel : 하나의 접근 방식을 제공했습니다. 메서드 범위 외부에 저장하거나 다른 메서드로 전송해야하는 경우 클래스 또는 Tuple (클래스 외부에서 사용하지 않는 경우)을 사용합니다. –

+0

더 나은 이해를 위해 더 많은 코드를 제공하려고합니다. 그러면 해결할 요지에 대처할 수 있습니다. – maliks

1

얻기 위해 LINQ를 사용하여 당신이 당신의 의견에 언급 한 바와 같이 가장 높은 :

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

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

위해 나는 키 또는 highestCat''에서'Paper_Category'을 얻을 것인가? – maliks

+0

@Taufel 예, 사전의 값에서 'Item1'입니다. – user3185569

+0

'eAuthor'가 목록이고 모든 'eAuthor'중에서 가장 높은 'Paper_Category' 개수를 확인해야합니까? – maliks

관련 문제