• 【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
        ' 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
        
    // 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