【VB.NET】Dictionary按Value进行排序

VB.NET

' sortbyvalue.vb

Imports System
Imports System.Net
Imports System.Text.RegularExpressions
Imports System.Collections.Generic

Class DictionarySortByValue
  
Shared Sub makeDict(ByVal dict As Dictionary(Of StringInteger))
    
Dim html As String

    
' HTMLの取得
    Using wc As New WebClient()
      html 
= wc.DownloadString("http://www.atmarkit.co.jp/")
    
End Using

    
' 単語に分割して、各単語の出現頻度をカウント
    For Each s As String In Regex.Split(html, "\W")
      
Dim word As String = s.Trim()
      
If Not word = "" Then
        
If dict.ContainsKey(word) Then
          dict(word) 
+= 1
        
Else
          dict(word) 
= 1
        
End If
      
End If
    
Next
  
End Sub

  
Shared Sub Main()
    
Dim dict As New Dictionary(Of StringInteger)
    makeDict(dict)

    
Dim sorted As List(Of KeyValuePair(Of StringInteger)) = sortByValue(dict)
    
' sorted.Reverse() ' 逆順にする場合

    
For Each kvp As KeyValuePair(Of StringIntegerIn sorted
      Console.WriteLine(kvp.Key 
& ":" & kvp.Value)
    
Next
    
' 出力例:
    ' a:542
    ' td:394
    ' 0:328
    ' width:289
    ' tr:284
    ' ……
  End Sub

  
Shared Function hikaku( _
    
ByVal kvp1 As KeyValuePair(Of StringInteger), _
    
ByVal kvp2 As KeyValuePair(Of StringInteger)) As Integer

    
' Valueの大きい順にソート
    Return kvp2.Value - kvp1.Value
  
End Function

  
Shared Function sortByValue( _
    
ByVal dict As Dictionary(Of StringInteger)) _
      
As List(Of KeyValuePair(Of StringInteger))

    
Dim list As New List(Of KeyValuePair(Of StringInteger))(dict)

    list.Sort(
AddressOf hikaku)
    
Return list
  
End Function
End Class

' コンパイル方法:vbc sortbyvalue.vb

 

C#


// sortbyvalue.cs

using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Collections.Generic;

class DictionarySortByValue {
  
static void makeDict(Dictionary<stringint> dict) {
    
string html;

    
// HTMLの取得
    using (WebClient wc = new WebClient()) {
      html 
= wc.DownloadString("http://www.atmarkit.co.jp/");
    }

    
// 単語に分割して、各単語の出現頻度をカウント
    foreach (string s in Regex.Split(html, "\\W")) {
      
string word = s.Trim();
      
if (word != "") {
        
if (dict.ContainsKey(word)) {
          dict[word]
++;
        } 
else {
          dict[word] 
= 1;
        }
      }
    }
  }

  
static void Main() {
    Dictionary
<stringint> dict = new Dictionary<stringint>();
    makeDict(dict);

    List
<KeyValuePair<stringint>> sorted = sortByValue(dict);
    
// sorted.Reverse(); // 逆順にする場合

    
foreach (KeyValuePair<stringint> kvp in sorted) {
      Console.WriteLine(kvp.Key 
+ ":" + kvp.Value);
    }
    
// 出力例:
    
// a:542
    
// td:394
    
// 0:328
    
// width:289
    
// tr:284
    
// ……
  }

  
static List<KeyValuePair<stringint>>
    sortByValue(Dictionary
<stringint> dict)
  {
    List
<KeyValuePair<stringint>> list
      
= new List<KeyValuePair<stringint>>(dict);

    
// Valueの大きい順にソート
    list.Sort(
      
delegate(KeyValuePair<stringint> kvp1, KeyValuePair<stringint> kvp2) {
        
return kvp2.Value - kvp1.Value;
      });
    
return list;
  }
}

// コンパイル方法:csc sortbyvalue.cs
摘自:http://www.atmarkit.co.jp/fdotnet/dotnettips/441sortbyvalue/sortbyvalue.html